2013-02-09 17 views
1

所以我在C++被寫一個小數學庫和一個標量乘以一個載體,我得到了一些問題,當我嘗試執行此操作用括號結果乘以使用重載* C++中運算

Vect V2; 
Vect V3; 
float S; 

Vect V1 = V2 + S * (V2 - V3); 
打交道時

我在重載操作符*中獲得的Vect值是一個新的Vect對象,而不是操作的(V2 - V3)部分的結果。這是代碼的其他相關部分。如果我通過調試來跟蹤操作,那麼兩個重載操作符自己可以正確工作,但不能一個接一個地工作。

Vect.h

Vect &operator - (const Vect &inVect); 
friend const Vect operator*(const float scale, const Vect &inVect); 

Vect.cpp

Vect &Vect::operator - (const Vect &inVect) 
{ 
    return Vect (this->x - inVect.x,this->y - inVect.y,this->z - inVect.z, 1); 
} 

const Vect operator*(const float scale, const Vect &inVect) 
{ 
    Vect result; 

    result.x = InVect.x * scale; 
    result.z = InVect.y * scale; 
    result.y = InVect.z * scale; 
    result.w = 1; 

    return result; 
} 

我也重載+和=操作者和他們的工作按預期我遇到的唯一問題是上述的問題。

回答

5

在您的operator-中,您創建了一個臨時的Vect並返回對該臨時的引用。在return聲明結束時臨時銷燬,並且返回的參考文件保持懸停狀態。對此引用做任何事情都會導致未定義的行爲。

相反,你應該operator-返回Vect按值:

Vect Vect::operator - (const Vect &inVect) 
{ 
    return Vect (this->x - inVect.x,this->y - inVect.y,this->z - inVect.z, 1); 
} 
+0

+1,打我給它。我應該學會打字速度更快。 – juanchopanza 2013-02-09 12:43:24

+0

噢,我的天啊,我一直在研究它幾個小時,沒有注意到它......我真的需要休息一下......感謝很多伴侶,真的很有幫助。 – user2057043 2013-02-09 12:55:34

+0

@ user2057043:**打開您的編譯器警告**!沒有人希望你發現那個小小的'&',但你的編譯器應該,並且可能有方法來報告它。 – 2013-02-09 16:16:20