operator= Überladung - ein Verständnisproblem
-
Hallo liebe Community,
Zuerst folgender Code:void Ctest::test() { Ctest *helpObj = new Ctest(); // hilfskopie helpObj = this; } // overloaded assignment Ctest& Ctest::operator=(const Ctest& rhs) { if(this != &rhs) { this->strName = rhs.strName; // Member vom Typ CString } return *this; }So, der oben gezeigte Code funktioniert soweit problemlos. Wenn ich nun jedoch in die Funktion test() die Zeile
// zurückkopieren helpObj = this;einfüge, bekomme ich einen error bezüglich einer ungültigen Zuweisung(l-value error). Nun verstehe ich leider überhaupt nicht warum das so ist ist. Liegt es am "const" im Kopf der Operatorüberladungsfunktion?!
Ich verstehe leider überhaupt nicht warum die Zuweisung nicht klappt. Ich habe doch sowohl links als auch rechts vom = einen pointer auf Ctest(), aber warum kommt dann der Fehler?
Über eine kurze "Aufklärung" wäre ich euch sehr dankbar!
Liebe Grüße,
inva
-
Erstens mal die Frage, wozu Du überhaupt ein Hilfsobjekt auf dem Heap brauchst.
Zweitens würde ich sowas mit einem Copy-Ctor machen:Ctest helpObj(*this); //...
-
Tachyon schrieb:
Erstens mal die Frage, wozu Du überhaupt ein Hilfsobjekt auf dem Heap brauchst.
Ich brauche es, weil ich eine DB Abfrage mache indem ich die entsprechende Methode des Objekts aufrufe, diese Methode manipuliert/verändert mir jedoch die Member des Objekts, was in diesem einen speziellen Fall nicht zwingend erforderlich ist bzw. nicht erwünscht ist.
Tachyon schrieb:
Zweitens würde ich sowas mit einem Copy-Ctor machen:
Ctest helpObj(*this); //...Das Problem was ich habe ist ja, dass ich die Daten auf dem Objekt "helpObj" nicht wieder zurück auf das objekt hinterm "this" zeiger bekomme.
Ich denk, dazu ist es sinnvoll etwas weiter auszuholen.
Es gibt eine Funktion in einer Dialogklasse. In dieser erzeuge ich ein Objekt vom Typ Ctest() und setze nahezu alle Member. Nun rufe ich eine Methode des eben erzeugten Ctest() Objekts auf und lande im Code, den ich in meinem ersten Beitrag gepostet habe. Diese Funktion dient dazu, dass noch "leere" Member zu setzen (daher wird der this zeiger benötigt), hierzu sind Info's aus der DB erforderlich, anhand welcher eine Auswertung stattfindet und das letzte Member gesetzt wird.Nun möchte ich mir gern eine Sicherheitskopie des Objekts machen, bevor mir meine DB Abfrage, welche ebenfalls als Membermethode aufgerufen wird (this->GetData("...")), alle vorher im Dialog gesetzten Inhalte überschreibt.
2 Lösungen die mir selber gerade dazu einfallen wären, entweder zuerst das entsprechende Member zu setzen, was wohl viel Aufwand sparen würde, oder einfach die Methode "GetData()" durch das Hilfsobjekt aufrufen zu lassen wodurch das Objekt hinter dem this Zeiger unangetastet bleibt.
Ich denk ich werde eine der beiden Lösungen nehmen, das ist sicher einfacher und spart mir Aufwand.
Wobei ich trotzdem neugierig bin, wie ichs lösen könnte wenn ich die Daten wieder aufs Objekt hinterm this Zeiger zurückschreiben wollte.
-
Du verschaffst Dir einen Zeiger auf ein Objekt mit:
Ctest *helpObj = new Ctest();
Danach weist Du diesem Zeiger einen anderen Wert zu mit:
helpObj = this;
Damit hast Du schon mal ein Memory-Leak, denn Du hast keinen Zeiger mehr auf Dein mit new angelegtes Objekt.
Danach willst Du vermutlichthis = helpObj;
machen?
Das geht natürlich nicht, denn this zeigt immer auf die aktuelle Objekt-Instanz.
Ich denke, Du willst in Wirklichkeit*helpObj = *this;
und
*this = *helpObj;
machen?
-
Hallo Belli, danke für deinen Tipp!
Belli schrieb:
Du verschaffst Dir einen Zeiger auf ein Objekt mit:
Ctest *helpObj = new Ctest();
Danach weist Du diesem Zeiger einen anderen Wert zu mit:
helpObj = this;
Damit hast Du schon mal ein Memory-Leak, denn Du hast keinen Zeiger mehr auf Dein mit new angelegtes Objekt.
Danach willst Du vermutlich
this = helpObj;
machen?
Das geht natürlich nicht, denn this zeigt immer auf die aktuelle Objekt-Instanz.
Ich denke, Du willst in Wirklichkeit*helpObj = *this;
und
*this = *helpObj;
machen?
Ja, stimmt ... ich war erst im Zweifel aber nachdem ich kurz drüber nachgedacht habe, hab ich festgestellt, dass du recht hast. Ich habe wohl einfach den * vor den Zeigern vergessen wodurch ich mir ja die Daten, auf die der Zeiger zeigt, hole.
Danke Belli, das wars!
Liebe Grüße,
inva
-
Wie wäre es, wenn du deiner Ctest Klasse einen Kopierkonstruktor gibst und dann eine Stackkopie machst?
void Ctest::test() { Ctest helpObj(*this); // helpObj ist jetzt eine Kopie auf dem Stack. // Ist schneller und hat keine Memory Leak Gefahr. }Grüssli
-
Dravere schrieb:
Wie wäre es, wenn du deiner Ctest Klasse einen Kopierkonstruktor gibst und dann eine Stackkopie machst?
void Ctest::test() { Ctest helpObj(*this); // helpObj ist jetzt eine Kopie auf dem Stack. // Ist schneller und hat keine Memory Leak Gefahr. }Grüssli
Danke für den Tipp, habs gleich umgesetzt

Da hab ich nun wieder was, zwar nicht neues, gelernt.Vielen Dank für die hilfreichen Ratschläge!
Grüße,
inva