Operator Overloading in C++

Seite 1 von 1 - Forum: Coding Stuff auf overclockers.at

URL: https://www.overclockers.at/coding-stuff/operator_overloading_in_c_53657/page_1 - zur Vollversion wechseln!


lexator schrieb am 01.11.2002 um 16:25

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 schrieb am 01.11.2002 um 16:37

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 schrieb am 01.11.2002 um 17:21

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 schrieb am 10.11.2002 um 15:46

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 schrieb am 10.11.2002 um 18:56

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.


Vivo schrieb am 10.11.2002 um 19:34

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.




overclockers.at v4.thecommunity
© all rights reserved by overclockers.at 2000-2026