2013-08-16 39 views
2

我正在編寫一個Vector和矩陣的類,我想知道如何避免開銷和泄漏當我想重載常見的操作符如+, - ,*和/ 。C++重載操作符並返回相同的對象

例如:

int main() 
{ 
    Vector3 aVector; //This has an address #1 
    Vector3 bVector; //This has another address #2 

    //rVector has an address #3 
    Vector3 rVector = aVector - bVector; //What will happen here? 
} 

和Vector類:

class Vector3 
{ 
    public: 
     float vX, vY, vZ; 
     Vector3& operator-(const Vector3& vector3) 
     { 
      //I want to calculate this vector with the "vector3" param 
      //But then what do I return? 

      //Test 1: 
      Vector3 result; //This has an address #4 
      result.vX = vX - vector3.vX; 
      result.vY = vY - vector3.vY; 
      result.vZ = vZ - vector3.vZ; 

      return result; //Did I just overwrite address #3? 

      //Test 2: 
      vX = vX - vector3.vX; 
      vY = vY - vector3.vY; 
      vZ = vZ - vector3.vZ; 

      return (*this); //What happened to address #3? And I just changed this vector's values and I need then again later 
     } 
} 

什麼是做到這一點的最好方法是什麼?

編輯:還有一個問題,如果我想這樣做:

Vector3 myVector = someVector - Vector3(x, y, z); 

如何編寫構造,因此不會做任何事情......不好? 我在想它會創建一個新班級,但在上面的句子中使用它之後,我不會有任何方法來引用它,這會導致以後出現問題嗎?

+3

'operator-'應該按值返回。在這裏返回一個參考是沒有意義的。 – juanchopanza

+0

只是爲了展開@juanchopanza,在這裏返回引用是返回一個超出範圍對象的引用。就像返回一個指向超範圍對象的指針一樣:你會打破某些東西。在這裏返回值。回報應該被消除,所以不要虛報(太多)關於僞造的副本。如果你真的很擔心,你可以製作構建器和作業,完成! – IdeaHat

+0

通常,'operator +'和'operator-'按值返回。但是,'operator + ='和'operator- ='通常會按照引用返回。 – Xaqq

回答

0

創建operator-作爲一個命名空間範圍的功能(而不是作爲一個成員函數):

Vector3 operator-(const Vector3 &lhs, const Vector3 &rhs) 
{ 
    Vector3 result{lhs}; 

    // Subtract out rhs 
    ... 

    // Do the math 
    return result; 
} 

沒有得到在任何情況下泄露,因爲你沒有任何分配關堆(自由存儲區)中。

1

您的實施沒有任何泄漏。您創建的每個矢量在退出函數範圍時都會被破壞。

至於返回值,我建議你按值返回(只是刪除&)。

對於你的第二個問題:這不是一個新的,所以沒有泄漏。另外,你不需要參考它,所以沒有真正的問題。

+1

它沒有任何「泄漏」,但是返回對超出範圍的對象的引用肯定是錯誤的。 – IdeaHat

+0

這不是泄漏 - 它濫用&運算符。並且沒有問題(沒有崩潰 - 並不意味着它是一個好主意),直到它在銷燬後使用它。 – MasterPlanMan

+0

此外,如果它是一個const引用,對象的生命可能會延長,如在這裏看到http://stackoverflow.com/questions/2615162/return-value-not-a-reference-from-the-function-bound-到一個const的組基準在 – MasterPlanMan

0

測試1將把答案存儲在一個新的向量(結果)中,並假設將其作爲參考返回給rVector。

rVector = result 

aVector = //its original value 

試驗2將存儲在載體中的功能被稱爲上(aVector)的答案,並返回作爲rVector參考。

rVector = aVector 

aVector = //the answer 

雖然使用測試2將節省內存的答案被存儲在功能(rVector和aVector)你想這可能不是在外面兩個地方。測試1是更安全的選擇,但請確保按值返回以避免像這裏其他人指出的範圍外錯誤。