C++ Aufruf ueberladener zuweisungsoperator =

trekschaf

Lt. Commander
Registriert
Dez. 2008
Beiträge
1.743
Moinse,

irgendwie hab ich ein Problem das er nicht in die Methode in eine Klasse springt. Er macht zwar das richtige aber nicht mit der dafür vorgehenden Methode. Also der einen Instanz der Klasse die Werte der anderen zuweisen aber scheinbar nicht mit der Methode die ich Programmiert habe.

Ich habe ein Klasse CPerson mit den Atributen
private:
//Attribute
char* vorname;
char* nachname;
int alter;

und mit einer Methode

//Ueberladener Zuweisungs = Operator
void CPerson::operator=(const CPerson *andere_person)
{
cout << "======> Ueberladener Zuweisungs Operator = Klasse CPerson\n";
set_vorname(andere_person->vorname);
set_nachname(andere_person->nachname);
set_alter(andere_person->alter);
}

Im Hauptprogramm erzeuge ich dann zwei Pointer auf Instanzen der Klasse CPerson

CPerson* test1 = new CPerson("Test","Tester",37);
CPerson* test2 = new CPerson("Gustav","Ganz",9);

Das macht er auch ohne Probleme und springt auch in den Überladenen Konstruktor (Mit Ausgabe im Konstruktor überprüft) und auch eine Ausgabe funktioniert.

wenn ich nun

test1=test2;

sollte ja der überladene Zuweisungsoperator der Klasse CPerson genutzt werden?!?
Aber scheinbar spring er nicht in die Methode der Klasse (keine Ausgabe =====> Ueberladener Zuweisungs ... zu sehen) , macht aber das richtige. Danach hat test1 die gleiche Werte wie test2.

cu trekschaf
 
Gibt ein Code-Button hier für Posts - erleichtert das Lesen von Quellcode ungemein.
Ansonsten sowas wie Pastebin und Co. benutzen.
 
Könnte sein, dass ich mich irre, aber: Du arbeitest mit Pointern. Du weist einem Pointer denselben wert zu, da greift der = Operator nicht. An der Instanz selber ändert sich nichts, sondern es zeigen einfach beide Pointer auf dieselbe Instanz.
 
bu1137, das ist es mit Sicherheit... bei einer Pointer-Zuweisung wird schließlich nie eine Instanz kopiert...

*test1 = *test2;
wäre der Code

aber der Operator ist eh falsch definiert, sollte ein Referenz-Parameter und kein Zeiger sein, so wie es wohl in sämtlichen Tutorials und Beispielen im Internet sonst auch der Fall ist...
 
Wie soll auch
Code:
void CPerson::operator =(const CPerson *andere_person)
auf
Code:
CPerson *CPerson::operator =(const CPerson *andere_person)
greifen?
 
@Yuuri: Fraglich, ob dein Operator überhaupt greift bzw. greifen soll. Ich sehe keinen Grund, warum jede Kopie (Zuweisung) eines Zeigers auf eine Instanz zu einer Kopie führen sollte...
 
Naja, mir ging es in erster Linie um den Rückgabewert. Wäre für mich schwer vorstellbar, wenn void zutreffen würde. Zumindest zeigt es mir die linke Seite des Operators nicht an. ;) Hab es aber noch nicht probiert.
 
wie müste denn dann hier ein kopierkonstruktor
aussehen und sein aufruf?
 
Constructor:
Code:
CPerson::CPerson(CPerson& person)
{
   this->field = person.field
  ...
}

Aufruf:
CPerson* person = new CPerson(*person1);

Der Kopierkonstrutkor wird häufig implizit aufgerufen, genauso wie ein mitunter so bezeichneter Typumwandlungskonstrutkror (im Grunde ist jeder Konstrutkor, der nur einen Parameter benötigt ein Typumwandlungskonstruktor)
 
Zurück
Oben