Baseclass call in operator=



  • Hallo zusammen,

    wir diskutieren gerade über die Frage, wo denn eigentlich im operator= der Aufruf auf die Methode Baseclass::operator=() hinkommt.

    Was ist aus Eurer Sicht besser, Variante a:

    Derived &
    Derived::operator=(const Derived & other){
    if(this != &other){
    Base::operator=(other);
    ....
    }
    return *this;
    }
    

    oder Variante b:

    Derived &
    Derived::operator=(const Derived & other){
    Base::operator=(other);
    if(this != &other){
    ....
    }
    return *this;
    }
    

    ???

    Was sind Eure Meinungen und Argumente? Ich finde Variante a besser, da damit keine "halb kopierten Instanzen entstehen", Kollege ist für b, da man nicht wisse was Base::operator= genau mache.

    Gruß und schone einmal Danke für Eure Gedanken.
    sven_



  • Eigentlich weder noch, besser ist das Copy-and-swap idiom

    Eine genauere Erklärung gibt es z.B. auch unter copy & swap in base and derived class.

    Die Selbstzuweisung (wenn die Abfrage überhaupt vorgenommen werden sollte) würde ich dann auch eher mit Variante A implementieren.



  • Wenn du Base::operator[] aufrufen musst, dann solltest du dir sowieso überlegen was du da eigentlich implementierst.

    Und was das Argument deines Kollegen angeht: bitte ihn mal ein Beispiel zu nennen, wo es sinnvoll und OK wäre, eine operator = Funktion auf Selbstzuweisung mit etwas anderem als "no effect" reagieren zu lassen.


Anmelden zum Antworten