Copy Constructor und Assignment Operator



  • Hallo !

    Wenn ich einen Copy Construktor und einen Assignment Operator
    selbst definiere, wie kann ich mir dann doppelte Schreibarbeit
    sparen wenn die Klasse viele Attribute hat die es zu kopieren gilt ?

    Ich meine wenn ich z.B. ein Attribut hinzufüge muß ich auch immer
    daran denken das ich sowohl im Copy Construktor als auch im
    Assignment Operator das Attribut auch kopiere. Das ist irgendwie
    lästig 🙄

    Kann ich nicht irgendwie im Copy Construktor einfach den
    Assignment Operator aufrufen das ich da nur eine Zeile
    dann hab oder umgekehrt ? Dann müßte ich nur in einer
    der beiden Methoden die Attribute kopieren.

    Danke für Tipps !
    Gruß GastXYZ





  • Danke habs jetzt schon so gelöst :

    A::A(const A &List)
    {
     (*this)= List; 
    }
    
    A& A::operator=(const A &List)
    {
     X= List.X;  
     Y= List.Y;
     Z= List.Z;
    
     return *this;
    }
    

    Scheint auch zu funktionieren 😃

    Oder könnte es da Probleme geben ?



  • lies meinen link



  • nein, es gibt nicht unbedingt Probleme, aber so wie du es implementiert hats, gibts beim Copy-Ctor keine explizite Initialisierung. Wenn X, Y, Z also von komplexeren Typen sind, bedeutet das, dass zuerst in der Impliziten Initialisierung ihr standardkobstruktor aufgerufen wird und dann im "Methodenkörper" der operator= für das bereits initialisierte Objekt. Das heißt: wenn X, Y, Z nicht gerade ints oder andere simple Datentypen sind, wird auf jedes einzelne doppelt zugegriife, einmal bei der Impliziten (default)-Initialisierung und einmal bei AUsführung des operator=



  • Achso also man sollte es besser umgekehrt machen,
    so wie in dem link davor beschrieben 🙂

    Danke für die Tipps !



  • sorry noch ne Frage...geht das auch irgendwie das man
    ohne dieses swap bei ??? den copykonstruktor
    benutzt um den zuweisungs operator zu realisieren ? 🙄

    A::A(const A &List)
    {
      X= List.X;  
      Y= List.Y;
      Z= List.Z;
    }
    
    A& A::operator=(const A &List)
    {
     ??? 
     return *this;
    }
    

  • Mod

    GastXYZ schrieb:

    sorry noch ne Frage...geht das auch irgendwie das man
    ohne dieses swap bei ??? den copykonstruktor
    benutzt um den zuweisungs operator zu realisieren ? 🙄

    ja, allerdings nur als beispiel, wie man es nicht machen soll:

    A& A::operator=(const A &List)
    {
        ~A();
        new(this) A(List);
        return *this;
    }
    

    falls *this nicht wirklich ein A, sondern ein abgeleites objekt ist, hat man hier undefiniertes verhalten.



  • ... und in jedem Fall ein Memoryleak. Wer ruft denn nach dem new das delete auf...



  • pumuckl schrieb:

    ... und in jedem Fall ein Memoryleak. Wer ruft denn nach dem new das delete auf...

    Niemand, wozu auch. Mach dich mal zum Thema "Placement new" schlau.


  • Mod

    fehlt noch der test auf selbstzuweisung, aber das beispiel soll ja auch abschrecken...
    und dann ist da noch die fehlende exception-sicherheit


Anmelden zum Antworten