"Christmas - the time to fix the computers of your loved ones" « Lord Wyrm

Operator Overloading in C++

lexator 01.11.2002 - 16:25 655 5
Posts

lexator

Bloody Newbie
Registered: Nov 2002
Location: Austria
Posts: 1
Hi!
Ich bin mit Operator-Overloading leider noch nicht so vertraut, deshalb hier meine Frage:
Das Overloading funktioniert doch nur bei Objekten, die nicht mit new erzeugt worden sind bzw nur dann, wenn man bei einem mit new erzeugten Objekt vorher den Pointer, der auf das Objekt zeigt, dereferenziert. Hab ich das richtig verstanden? ein bsp:

class Lock
{
Lock (...)
Lock& operator=(const Lock& rhs)
{
// some code that modifies Lock::this
}
...
};

int main() {
Lock *lock1 = new Lock();
Lock *lock2 = lock1;
}

In diesem Beispiel hab ich ja Pointer auf meine locks, dh der Assignment
Operator, den ich neu definiert hab, kommt gar nie zum Zug, oder?
Und jetzt die ultimative Frage:
Gibt es eine Moeglichkeit, dass man den Assignment Operator so ueberlaedt,
dass er auch bei Pointern auf das Objekt irgendwas machen kann (zb den
Pointer, auf den zugewiesen wird, dereferenzieren und das Objekt dahinter
veraendern kann)?

Ich hoffe, irgendwer hat mein Problem verstanden - wenn nicht, sagts es mir
bitte, dann probier ichs nochmal zu beschreiben :)
Und vielleicht hat ja irgendwer eine Antwort auf meine Frage!
Schon imn voraus ein grosses Dankeschoen!

alex

that

Moderator
Hoffnungsloser Optimist
Avatar
Registered: Mar 2000
Location: MeidLing
Posts: 11338
Du kannst nur statt dem Pointer eine eigene Klasse verwenden, der du mit Operator Overloading in den meisten Bereichen Pointer-Semantik beibringen kannst. auto_ptr ist z.B. sowas.

Oder du dereferenzierst einfach deine Pointer. :)

Ringding

Pilot
Avatar
Registered: Jan 2002
Location: Perchtoldsdorf/W..
Posts: 4300
Zitat von lexator
Das Overloading funktioniert doch nur bei Objekten, die nicht mit new erzeugt worden sind bzw nur dann, wenn man bei einem mit new erzeugten Objekt vorher den Pointer, der auf das Objekt zeigt, dereferenziert. Hab ich das richtig verstanden?

Wie ein Objekt erzeugt wurde, ist völlig egal.

Vivo

Dreamworker
Avatar
Registered: May 2002
Location: Tal der Könige
Posts: 1478
Zitat von Ringding
Wie ein Objekt erzeugt wurde, ist völlig egal.

Völlig egal ? Bist sicher ? ... Ich denk ma wenn es dynamisch ist muss man es immer vorher dereferenzieren ...

Beim überladen wird doch die funktion folgendermasen aufgerufen :

lock1.operator=(lock2);

müsste man da beim operator= nicht vorher dereferenzieren ... weil auf ein dynamisches kann man ja auf die Funktionen bekanntlicherweise nur mit "->" zugreifen.

Ringding

Pilot
Avatar
Registered: Jan 2002
Location: Perchtoldsdorf/W..
Posts: 4300
Code:
class C { ... };

void bla()
{
  C a;
  C& b = *new C();
}

Siehst du jetzt einen Unterschied zwischen a und b? Ich nicht. Und sie wurden unterschiedlich erzeugt.

lexators Intention ist aber ziemlich sinnlos IMHO, denn jeder erwartet, dass ein Operator auf einen dereferenzierten Pointer das Objekt dahinter betrifft und ein Operator auf einen Pointer den Pointer selber betrifft. Wenn plötzlich der Operator auf den Pointer das Objekt dahinter verändert, kennt sich niemand mehr aus.
Bearbeitet von Ringding am 10.11.2002, 19:00

Vivo

Dreamworker
Avatar
Registered: May 2002
Location: Tal der Könige
Posts: 1478
hehe ... des is nett ...

Aber es ging darum ein Objekt über einen Pointer dynamisch zu erzeugen, was dein Code nicht macht. Denn wenn du schreibst C *b = new C(); macht das sehr wohl einen Unterschied.

Und nochma zum Problem von Lexator : Ich denkma mit "friend" müsste es funzen, wenn er 2 Pointer von Datentyp "*Lock" in die Funktion liefert.
Kontakt | Unser Forum | Über overclockers.at | Impressum | Datenschutz