Den überladenen Zuweisungsoperator der Superklasse verwenden.



  • Helmut.Jakoby schrieb:

    Du musst den operator= der Oberklasse aufrufen lassen.

    Genau so heißt das Thema. Die Frage ist: wie?



  • DannyLo schrieb:

    Becher::operator=(b)
    

    So:

    Becher::operator=(*this)
    


  • DannyLo schrieb:

    Ich habe versucht

    (Becher)(*this) = (Becher)b;
    

    aber das geht nicht.

    Das ergibt auch keinen Sinn mit den Typen. Wenn dann mit Referenztypen:

    (Becher&)*this = b; // b muss man nicht casten
    // oder besser:
    static_cast<Becher&>(*this) = b;
    

    Mir ist klar, dass ich irgendwie den Bereichoperator anwenden soll, z.B.:

    Becher::operator=(b)
    

    aber ich komme nicht darauf, wie man das für den Objekt *this macht.

    Das this sollte wie immer automatisch mit übergeben werden. Ob du nun

    this->Becher::operator=(b);
    

    oder so wie du schreibst, spielt keine Rolle.



  • ich bins schrieb:

    DannyLo schrieb:

    Becher::operator=(b)
    

    So:

    Becher::operator=(*this)
    

    Also,

    *this=(b);
    

    ist äquivalent zu

    *this.operator=(b);
    

    Deswegen sind deine Vorschläge leider nicht richtig.



  • Bashar schrieb:

    Das this sollte wie immer automatisch mit übergeben werden. Ob du nun

    this->Becher::operator=(b);
    

    oder so wie du schreibst, spielt keine Rolle.

    Wow, das geht ja. Ich habe gar nicht erwartet, dass

    Becher::operator=(b);
    

    tatsäslich funktioniert, und habe mir deswegen das Leben schwerer gemacht.
    Kann mir vielleicht jemand deutlich erklären, warum das so klappt?



  • Verstehe ich dich richtig, dass Du Becher::inhalt nur in Becher& Becher::operator=(const Becher &b) aus b übernehmen willst?
    Darum musst Du den Zuweisungsoperator von Becher im Zuweisungsoperator mit b aufrufen und nicht mit this (this soll ja als Unterklasse inhalt von b bekommen.
    Edit: Warum hast du nicht deine möglichen Lösungen ausprobiert? Die eine war ja richtig. Siehe mein vorheriges Posting "Du musst den operator= der Oberklasse aufrufen lassen. ".



  • Helmut.Jakoby schrieb:

    Verstehe ich dich richtig, dass Du Becher::inhalt nur in Becher& Becher::operator=(const Becher &b) aus b übernehmen willst?

    inhalt, und zwei andere Variablen: fassungsvermoegen und fuellgrad.

    Helmut.Jakoby schrieb:

    Darum musst Du den Zuweisungsoperator von Becher im Zuweisungsoperator mit b aufrufen und nicht mit this (this soll ja als Unterklasse inhalt von b bekommen.

    Das ist mir ja klar, aber der Zuweisungsoperator ist immer noch eine Elementfunktion, und ich dachte mir ich muss sie unbedingt für den Objekt *this aufrufen, weil ich nach obigem Schema gedacht habe, dass a=b aquivalent zu **a.**operator=(b) ist.

    Helmut.Jakoby schrieb:

    Edit: Warum hast du nicht deine möglichen Lösungen ausprobiert?

    Wie schon oben erwähnt, ich habe es für unmöglich gehalten, dass die Lösung richtig ist. Das war mein Fehler, tut mir leid.



  • Wenn du std::string statt char* verwenden würdest, könntest du dir den operator= auch komplett sparen.



  • manni66 schrieb:

    Wenn du std::string statt char* verwenden würdest, könntest du dir den operator= auch komplett sparen.

    Ich hatte eine bestimmte Aufgabenstellung.



  • http://www.cppbuch.de/cppbuchw.tgz
    herunterladen und entpacken. Im Verzeichnis cppbuch/k9/zuweisung_vererbung ist ein vollständiges Beispiel, sogar mit 3 Vererbungsebenen und char* Attributen.


Anmelden zum Antworten