[C++] Zuweisungsoperator überladen für Zeiger auf Objekte

metalbeppi

Cadet 4th Year
Registriert
Sep. 2006
Beiträge
126
Hallo, wenn es um Zuweingsoperatoren überladen geht, findet ja man meistens folgendes:

Klasse& Klasse:: operator=(const Klasse& src) {
...
return *this
}

Das funktioniert ja dann auch gut für Aufrufe wie:

Klasse k1;
Klasse k2;

k1 = k2;

Was aber, wenn ich folgendes haben will?:

Klasse *k1, *k2;

k1 = k2;

Bei mir ruft er dann immer die Standardzuweisungsoperation auf...
 
Ohne es zu wissen, aber was ist, wenn du die Zeiger einfach dereferenzierst?
Also: (*k1)=(*k2);
?

Gruß,

badday
 
Dein unteres Beispiel, metalbeppi, macht eben genau das was dort steht: den Zeiger kopieren.

Die Semantik von Zeigerzuweisungen ändern zu können wäre höchstgeradig gefährlich und hätte fatale Konsequenzen, auch wenn diese für dich vielleicht momentan nicht absehbar sind.
 
@badday
Das funktioniert natürlich, wenn man "=" entsprechend überlädt, aber ich hätte es halt gerne für objectPtr2 = objectPtr1 gehabt.

@7H3 N4C3R
Naja ich will ja nicht generell die Semantik von Zeigerzuweisungen ändern, sondern nur, wenn man den Operator mit Zeigern auf bestimmte Objekte verwendet.

Mein Vorlesungsprofessor hat gesagt, dass es nicht möglich ist, den Zuweisungsoperator so zu überladen, dass zB objectPtr2 = objectPtr1 eine Deepcopy macht. (Also möglich ist es schon, es wird aber trotzdem standardmäßig gehandelt, also wird die im Zeiger gespeicherte Adresse kopiert).
Trotzdem Danke!
 
Zuletzt bearbeitet:
metalbeppi schrieb:
@badday
Naja ich will ja nicht generell die Semantik von Zeigerzuweisungen ändern, sondern nur, wenn man den Operator mit Zeigern auf bestimmte Objekte verwendet.
Naja, aber kannst du eins ändern, kannst du alles ändern. ;) Es ist einfach aus gutem Grund nicht möglich.
Kurz nachgedacht: Es würde - sofern ich nix übersehen habe - aus Pointern semantisch Referenzen machen. Dafür gibt es aber schon Referenzen. ;) Außerdem wären die so neu geschaffenen "Referenzen" nicht so sicher wie die in der Sprache existierenden (direkte Nullzeiger-Zuweisung inkl. Absturz möglich, Initialisierung mit einem Objekt ist nicht notwendig, macht aber bei der ersten Zuweisung die Grätsche). Diese Art von Fehlern kann man zwar mit Referenzen auch bauen, aber der Compiler kann zur Compilezeit vor den fiesesten Fallstricken meckern.
Außerdem kannst dann nie wieder mit Pointern auf deine Klassen arbeiten. Jeder, der mit diesem Code arbeiten muss, kann außerdem die Folgen nicht mehr absehen, da du ein grundlegendes Feature der Sprache (wenn auch nur in einem speziellen Fall) geändert hättest. Zusätzlich würde dieser selbst-definierte Operator an der Überladungsauflösung teilnehmen und "lustige" Nebeneffekte produzieren.
 
Zurück
Oben