2009-08-20 28 views
14

Sadece bir + operatörünü aşırı yüklemeye çalışıyorum ve bu derleyiciyi uyarıyorumC++ derleyici uyarısı - dönen yerel değişken

reference to local variable 'tmp' returned 

İşte

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

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

cevap

15

Bir yerel değişkene referans gönderemezsiniz. operator+() işlevinin içinde, tmp adlı yerel bir değişken oluşturuyorsunuz. İşlev çıkar çıkmaz yok olur. Bu değişkene bir başvuru döndüremezsiniz, çünkü arama işlevi dönüş değerini aldığında artık mevcut değildir. Uyarılar olmadan

const Int operator+(const Int&) const; 

Bu kuracağına ve çok iyi çalışır:

işlevin sizin tanımını değiştirin

.

7

Yapmaya çalıştığınız, döndürdüğünüz anda geçersiz olacak bir bellek konumuna başvuru göndermektir.

Değişken tmp, kapsam dışına çıktığında (yani, operatör + bittiğinde) kaybolacaktır. dönüş türü Int & Çünkü

değil tmp değeri "dönüş tmp" ama tmp için bir referans olarak döndürülür. Bu, yöntem bittikten sonra artık tmp olmayacağından doğru değil!

Çözüm: referans olarak iade etmeyin, ama Int

olarak
0

tmpauto bir depolama sınıfı vardır ve biz çıktığınızda kaybolacaktır. Cevap statik belirtmek.

static Int tmp = value + p.value; 

tmp atanan depolama

program süresince saklıdır kalır.