überladen von Operatoren



  • Reptile100 schrieb:

    ich hab ein Problem folgenden Quelltext zu verstehen:

    Zu sehen ist eine Klasse mit virtuellem Destruktur (für spätere Ableitungen gebraucht) und die Überladung für 3 Operatoren.
    Die kannst zu dann so anwenden:

    Polynom p1, p2, p3;
    p1 = p2; // entspricht p1.operator=(p2);
    p1 *= p3; // entspricht p1.operator(p3);
    p2 = p1 + p3; // entspricht p2 = p1.operator(p3);
    

    relativ simple, nicht?

    Reptile100 schrieb:

    Der Compiler findet frei Fehler.

    und du bist dir natürlich zu fein uns diese mitzuteilen?

    Reptile100 schrieb:

    Was macht der *this Zeiger? Ist die " r+=P " überhaupt so machbar?

    Polynom::operator+(const Polynom &P) const
    {
       Polynom r;
       r= *this;
       r+=P;
    
       return r;
    }
    

    this ist der Zeiger auf das Object, *this der dereferenzierte Zeiger und somit das Objekt selbst.

    ich würde dir empfehlen der Methode auch einen Rückgabewert zu geben 😉



  • Danke für eure schnellen Antworten.

    Fehler 1: error C2556: int_thiscall Polynom::operator +(const class Polynom &) const : Überladene Funktion unterscheidet sich nur hinsichtlich des Rückgabetyps von class Polynom_thiscall Polynom::operator +(const class Polynom &)const

    Fehler 2: error C2371: + : Neudefinition; unterschiedliche Basistypen

    Fehler 3: error C2676: Binaerer Operator += : class Polynom definiert diesen Operator oder eine Konvertierung in einen für den vordefinierten Operator geeigneten Typ nicht.

    Ich verstehe noch nicht wozu der this Zeiger hier gebraucht wird. Warum kann nicht gleich mit r+=P weitergemacht werden?



  • Die Fehler kommen vermutlich vom fehlenden Rückgabetyp bei der Definition der Methode operator+. Da fehlt ein "Polynom " am Anfang der Zeile.

    Ich verstehe noch nicht wozu der this Zeiger hier gebraucht wird. Warum kann nicht gleich mit r+=P weitergemacht werden?

    Weil operator+ doch das linke und das rechte Element addiert. Und das linke Element ist nunmal this. Ohne die Initialisierung (oder hier: Zuweisung, ist eigentlich weniger elegant) wäre r leer.



  • Ich hab jetzt ein "Polynom" davor gesetzt.

    Polynom::Polynom operator+(const Polynom &P)const
    {
        Polynom r;
        r=*this;
        r+=P;
        return r;
    }
    

    jetzt hab ich folgende Fehler:

    Error C2143: Fehlendes ; vor +
    Error C2350: Polynom::Polynom::Polynom ist kein statisches Element
    fatal error C1004: Unerwartetes Dateiende

    Damit ich das mit dem This Zeiger auch richtig verstehe:
    würde r ohne die this Zuweisung wie eine normale Variable behandelt werden?



  • [quote="Reptile100"]Ich hab jetzt ein "Polynom" davor gesetzt.

    Polynom::Polynom operator+(const Polynom &P)const
    {
        Polynom r;
        r=*this;
        r+=P;
        return r;
    }
    

    Der Rückgabetyp gehört vor den Klassennamen.

    Polynom Polynom::operator+(const Polynom &P)const
    {
        Polynom r;
        r=*this;
        r+=P;
        return r;
    }
    

    gruss



  • Danke für eure Hilfe. Jetzt hab ich keinen Fehler mehr.

    Gruß
    Reptile100



  • Hast du für Polynom keinen copy-ctor? Dann kannst du dir die Zuweisung sparen ... wenn dann noch operator+= korrekt implementiert ist, geht auch das:

    const Polynom::Polynom operator+(Polynom const & rhs) const
    {
        Polynom tmp(*this);
        return tmp += rhs;
    }
    


  • queer_boy schrieb:

    a += b;
    

    Meintest natürlich tmp+= b 😉



  • jaja, man sollte sich alles zweimal durchlesen ^^'
    aber kein problem, ich geb's weiter:

    (D)Evil schrieb:

    const Polynom::Polynom operator+(Polynom const & rhs) const
    

    du meintest natürlich const Polynom Polynom::operator+ . (oder auch gleich ohne const )


  • Mod

    Nebenbei verträgt sich Operatorüberladung kaum mit polymorphen Basisklassen - Vererbung+Operatorüberladung ist fast immer ein Fehler. Natürlich gibt es auch Ausnahmen, wie die Standardstreams, aber die sind in mehrfacher Hinsicht ein Sonderfall.
    Die optimale Implementierung für operator+, wenn dieser auf += basieren soll und die Signatur so vorgeschrieben ist, lautet im Übrigen:

    Polynom Polynom::Polynom operator+(Polynom const & rhs) const
    {
        Polynom tmp(*this);
        tmp += rhs;
        return tmp;
    }
    

    denkbar ist noch

    Polynom operator+(Polynom lhs, Polynom const & rhs)
    {
        lhs += rhs;
        return lhs;
    }
    

    jede andere auf += basierende Form führt zwangsweise zu zusätzlichen nicht (per 12.8/15) eliminierbaren Kopien.


Anmelden zum Antworten