Mal wieder Überladung von Operatoren



  • In der Theorie sind überladene Operatoren ja 'ne tolle Sache. Jetzt, wo ich am Apfelmännchen-Fraktal rumrechne, sind die überladenen Operatoren für komplexe Zahlen schwer wegzudenken aber ich habe ein grundlegendes Problem.

    class CComplex  
    {
    public:
        double real;
        double imag;
    
    // Operatoren ...
    // Methoden ...
    }
    

    Wenn ich das mache :

    CComplex &CComplex::operator-(const CComplex &zahl)
    {
            CComplex pZahl;
        pZahl->imag=imag-zahl.imag;
        pZahl->real=real-zahl.real;
        return *pZahl;
    }
    

    dann kriege ich irgendwann einen Speicherüberlauf, weil anscheinend immer neue Objekte erzeugt, aber nie zerstört werden.

    Wenn ich das mache :

    CComplex &CComplex::operator*(const CComplex &zahl)
    {
        CComplex pt2;
        //(a+bi)*(c+di)=(ac+adi+bci-bd)=ac-bd+(ad+bc)i
        pt2.real=(real*zahl.real)-(imag*zahl.imag);
        pt2.imag=(real*zahl.imag)+(imag*zahl.real);
        return pt2;
    }
    
    // und weiter :
    
    CComplex &CComplex::operator+(const CComplex &zahl)
    {
        CComplex pt3;
        pt3.imag=imag+zahl.imag;
        pt3.real=real+zahl.real;
        return pt3;
    }
    
    CComplex &CComplex::operator=(const CComplex &zahl)
    {
        imag=zahl.imag;
        real=zahl.real;
        return *this;
    }
    

    dann wird bei einer Rechnung wie : z2=(z1*z1)+c mit z1,z2,c vom Typ CComplex
    zuerst die Multiplikation gerechnet und in der Addition ist bereits das Ergebnis der Multiplikation verloren. Irgendetwas grundlegendes mache ich anscheinend falsch. Aber was - hat jemand 'ne Idee ?



  • PS : Im ersten Fall ist ein Fehler - das Objekt wird natürlich so erzeugt :

    CComplex pZahl= new CComplex;
    


  • Du gibst Referenzen auf lokale Objekte zurück.



  • Autsch! - Wie blöd. Und dafür schreib' ich hier 'nen halben Roman !
    (Anfänger-Pech...) Dein Hinweis war dafür um so kürzer, aber wichtig, den jetzt funktioniert's.
    Danke 🙂


Anmelden zum Antworten