warning: reference to local variable ‘result’ returned



  • Folgenden Code habe ich geschrieben

    class Complex {
    ...
    		Complex& operator+=(const Complex &rhs );
    		const Complex& operator+(const Complex &rhs );
    		Complex& operator-=(const Complex &rhs );
    		const Complex& operator-(const Complex &rhs );
    ...
    };
    ...
    Complex& Complex::operator-=(const Complex &rhs ) {
    	cout << a << " " << b << endl;
    	cout << rhs.a << " " << rhs.b << endl;
    	a -= rhs.a;
    	b -= rhs.b;
    	cout << a << " " << b << endl;
    
    	return *this;
    }
    
    const Complex& Complex::operator-(const Complex &rhs ) {
    	Complex result = (*this); <--------- Zeile 45
    	result -= rhs;  
    	return result;
    }
    
    Complex& Complex::operator+=(const Complex &rhs ) {
    	a += rhs.a;
    	b += rhs.b;
    	return *this;
    }
    
    const Complex& Complex::operator+(const Complex &rhs) {
    	Complex result = (*this);
    	return result+=rhs;
    }
    
    bool Complex::operator==(const Complex &other) const {
    	cout << a << " == " << other.a << " && " << b << " == " << other.b << endl;
    	return (a == other.a && b == other.b);
    }
    ...
    int main() {
    ...
    	Complex c3(10,10);
    	Complex c4(-2,6);
    	if( (c3 + c4) == Complex(8,16) )
    		cout << "+ korrekt" << endl;
    	else
    		cout << "+ FALSCH <-----------------" << endl;
    
    	if( (c3 - c4) == Complex(12,4) )
    		cout << "- korrekt" << endl;
    	else
    		cout << "- FALSCH <-----------------" << endl;
    	return 0;
    }
    

    Wenn ich das dann kompiliere warnt mich der Compiler

    make
    g++ -o 2DFourier.o -c 2DFourier.cpp
    2DFourier.cpp: In member function ‘const Complex& Complex::operator-(const Complex&)’:
    2DFourier.cpp:45: warning: reference to local variable ‘result’ returned
    g++ -o 2DFourier 2DFourier.o

    Wenn ich das Programm dann ausführe erhalte ich folgende Ausgabe

    ./2DFourier
    0 == 8 && 0 == 16
    + FALSCH <-----------------
    10 10
    -2 6
    12 4
    0 == 12 && 0 == 4
    - FALSCH <-----------------

    Dass a und b bei der Rückgabe von "+" jeweils null sind, liegt wohl daran, dass ich in der Operatormethode lokal eine Instanz erzeuge, die dann nicht zurückgegeben werden kann, oder ist es was anderes? Wie kann ich das reparieren?



  • HändyÄndy schrieb:

    Dass a und b bei der Rückgabe von "+" jeweils null sind, liegt wohl daran, dass ich in der Operatormethode lokal eine Instanz erzeuge, die dann nicht zurückgegeben werden kann, oder ist es was anderes? Wie kann ich das reparieren?

    Du erzeugst eine lokale Instanz, richtig. Die kann durchaus zurückgegeben werden (Wenn du das machst erzeugt der Copiler ggf. eine Kopie, aber das ist hier nicht weiter von Bedeutung).
    Was du nicht zurückgeben kannst, ist eine Referenz auf die Variable, weil die Referenz danach ins Nirvana zeigt. Und genau das ist es was du tust. Der Fehler liegt im Rückgabetyp des op-, aber das sagt dir der Compiler ja auch.



  • Es müsste "Complex operator + (const Complex&);" heißen.
    Abgesehen davon, könntest du doch auch einfach std::complex verwenden 🙂



  • Wie kann ich das reparieren?

    Indem du die Funktion folgendermaßen änderst:
    const Complex Complex::operator-(const Complex &rhs )
    Ich würde auch noch das const im Rückgabetyp weglassen.
    Außerdem wird der operator-() üblicherweise nicht als Klassenmethode definiert.

    Du weißt schon, dass es std::complex gibt, oder?



  • Danke für die Antwort. Ich habe den Rückgabewert von "Complex&" nach "Complex" geändert.



  • Das Problem bei std::complex ist bloß, dass man dort keine komplexen Zahlen in der polaren Darstellung erzeugen kann, also mit r und phi ("r*exp(i*phi)"). std::complex erlaubt laut man page nur die Erzeugung mittels "double complex z = 1.0 + 1.0 * I; // z = 1 + i" in karthesicher Darstellung. Das reicht in meinem Fall leider nicht aus.



  • HändyÄndy schrieb:

    Das Problem bei std::complex ist bloß, dass man dort keine komplexen Zahlen in der polaren Darstellung erzeugen kann, also mit r und phi ("r*exp(i*phi)"). std::complex erlaubt laut man page nur die Erzeugung mittels "double complex z = 1.0 + 1.0 * I; // z = 1 + i" in karthesicher Darstellung. Das reicht in meinem Fall leider nicht aus.

    Dann reicht es, eine einzelne Funktion zu schrieben, die aus polaren Koordineten ein std::complex erzeugt. Das ist ein Einzeiler. Deshlab gleich ne ganze eigene Klasse aus dem Boden zu stampfen ist Overkill.



  • Stimmt natürlich, ich hatte allerdings meine Implementierung schon fertig, bevor ich wusste, dass es std::complex überhaupt gibt. Nun hab ich schon alles selber gemacht...



  • HändyÄndy schrieb:

    Das Problem bei std::complex ist bloß, dass man dort keine komplexen Zahlen in der polaren Darstellung erzeugen kann, also mit r und phi ("r*exp(i*phi)"). std::complex erlaubt laut man page nur die Erzeugung mittels "double complex z = 1.0 + 1.0 * I; // z = 1 + i" in karthesicher Darstellung. Das reicht in meinem Fall leider nicht aus.

    http://www.cplusplus.com/reference/std/complex/polar/
    Übrigens sind das wohl die Manpages für die C99-Complexerweiterung und nicht für std::complex .


Anmelden zum Antworten