Den überladenen Zuweisungsoperator der Superklasse verwenden.



  • Hallo Leute. Ich habe eine Frage, die sich auf einen Code bezieht, der sich dort finden lässt.
    Wie man sieht, gibt es eine Klasse Becher und eine Unterklasse BecherMitAufdruck. In der Oberklasse habe ich einen überladenen Zuweisungsoperator implementiert.

    Becher& Becher::operator=(const Becher &b)
    {
    	if (this != &b)
    	{
    		delete [] inhalt;
    		inhalt = strdupnew(b.inhalt);
    		fassungsvermoegen = b.fassungsvermoegen;
    		fuellgrad = b.fuellgrad;
    	}
    	return *this;
    }
    

    In der Unterklasse wird der Operator auch überladen:

    BecherMitAufdruck& BecherMitAufdruck::operator=(const BecherMitAufdruck &b)
    {
    	if (this != &b)
    		{
    			delete [] inhalt;
    			delete [] aufdruck;
    			inhalt = strdupnew(b.inhalt);
    			aufdruck = strdupnew(b.aufdruck);
    			fassungsvermoegen = b.fassungsvermoegen;
    			fuellgrad = b.fuellgrad;
    		}
    	return *this;
    }
    

    Ich würde gern in dieser Funktion meinen bereits überladenen Operator der Superklasse verwenden anstatt, die Zuweisungen, die er macht, nochmal zu implementieren, weil dadurch ja eigentlich der Sinn der Vererbung teilweise verloren geht. Ich habe versucht

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

    aber das geht nicht. 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.

    P.s.: ich hoffe, ich habe mich beim ersten Eintrag nicht all zu viel blamiert 🙄



  • Du musst den operator= der Oberklasse aufrufen lassen.



  • 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