2009-08-20 8 views
14

ich einfach einen Operator + zu überlasten versuchen, und ich bin immer diese CompilerC++ Compiler-Warnung - Rückkehr lokaler Variable

reference to local variable 'tmp' returned 

Hier ist der Code für die Überlast

const Int& Int::operator+(const Int& p) const 
{ 
    Int tmp = value + p.value; 
    return tmp; 
} 

Hier Warnung ist die Klasse

class Int{ 
    int value; 
public: 
    Int() {} // default constructor 
    Int(int v) : value(v) {} 
    Int& operator=(const Int&); 
    const Int& operator+(const Int&) const; 
}; 

Antwort

15

Sie können keine Referenz auf eine lokale Variable zurückgeben. Innerhalb der operator+()-Funktion erstellen Sie eine lokale Variable namens tmp. Es wird zerstört, sobald die Funktion beendet wird. Sie können keine Referenz auf diese Variable zurückgeben, da sie nicht mehr existiert, wenn die aufrufende Funktion den Rückgabewert erhält.

Ihre Definition der Funktion ändern:

const Int operator+(const Int&) const; 

Es ohne Warnungen bauen würde und arbeiten auch in Ordnung.

7

Sie versuchen, einen Verweis auf einen Speicherort zurückgeben, der ungültig sein wird, sobald Sie es zurückgeben.

Die Variable tmp wird verschwinden, wenn sie den Gültigkeitsbereich verlässt (dh wenn Operator + beendet ist).

Da Ihr Rückgabetyp Int & ist, wird bei "return tmp" nicht der Wert von tmp zurückgegeben, sondern ein Verweis auf tmp. Das ist nicht korrekt, da tmp nach dem Beenden der Methode nicht mehr existiert !!

Lösung: Sie Rückkehr nicht als Referenz, sondern als Int

0

tmp Speicherklasse von auto hat und verschwindet, wenn wir verlassen. Die Antwort ist, statisch zu spezifizieren.

static Int tmp = value + p.value; 

Die zu tmp zugeordneten Speicher wird für die Dauer des Programms bleiben vorbehalten.