2013-06-21 63 views
0

我無法理解爲什麼當我的方法返回一個對象時,對象將被銷燬。對象在返回之前被銷燬

發佈這裏的類結構和方法。

class Var 
{ 
public: 
    Var operator += (const Var& var); 
private: 
    Var _operation(Var* var, VAR_OPERATOR op); 
} 

方法:

Var Var::operator += (const Var& var) 
{ 
    Var tmp = this->_operation((Var *)&var,VAR_ADD); 
    return tmp; // here the tmp variable is void 
} 
Var Var::_operation(Var* var, VAR_OPERATOR op) 
{ 
    Var tmp; 
    // operations 
    // here the tmp variable has value 
    return tmp; 
} 

任何人都知道爲什麼嗎?

+9

你沒有正確實現你的拷貝構造函數嗎?順便說一句,爲什麼演員?爲什麼_operation參數不是一個const指針?如果你有一個很好的理由,至少請使用const_cast來拋出const而不是C樣式。 –

+0

@SebastianRedl是thx,我忘了複製構造函數:S – pava91

+0

它應該是const。運算符超載已經成爲慣例,這來自對數學運算符的直觀理解。如果你做a = a + 5,你不會指望5改變,你會嗎?所以,如果它改變了右手邊的參數,給它一個正確的功能,並且不要使用操作符... –

回答

1

tmp Var存在於其範圍內......所以它只存在於運算符+ =和_operation內。當tmp超出範圍時,調用析構函數。要做到這一點,正確的做法是:

Var& Var::operator += (const Var& var) 
{ 
    _operation(*this, &var, *this, VAR_ADD); 
    return *this; 
} 
void Var::_operation(const Var& lhs, const Var& rhs, Var& res, VAR_OPERATOR op) 
{ 
    res == ... 
    // operations 
    // here the tmp variable has value 
} 

隨着+ =運算符我們的意思是內部數據將改變(在這種情況下*此+ = VAL),所以療法沒有返回類型,我們也可以回到*對此,有情況,如:

(v += val) - val2; 

v += val將被稱爲operator +=和THRE回報是改變v,現在如果我們定義 - 就像friend Val operator - (const Val& lhs, const Val& rhs)操作我們可以串聯表達式。

你所要做的是:

Var Var::operator + (const Var& var1, const Var& var2) 
{ 
    Var tmp; 
    // internal stuff 
    return tmp; 
} 

現在,這個操作的朋友可以

friend Var operator + (const Var& var1, const Var& var2) 
{ 
    Var tmp; 
    // internal stuff 
    return tmp; 
} 

這仍然是錯誤的,因爲我們需要定義拷貝構造函數和分配新建分配FY操作!因爲temp會被銷燬,但首先我們可以調用copy構造函數(或assigment操作符),這樣我們就可以擁有一個「clone」了。

所有現代C++編譯器都允許一個名爲RVO(返回值優化)的東西,但這是另一回事。

+0

我不想使用「this」作爲結果,我需要其他變量:S – pava91

+2

所以你選擇錯誤的操作符,使用運算符+而不是 –

+0

與一些編輯我修復所有。運營商的工作! – pava91