簡體   English   中英

C ++重載運算符並返回相同的對象

[英]C++ overloading operators and returning same object

我正在為Vector和Matrices編寫一個類,我想了解當我想重載+,-,*和/之類的常用運算符時如何避免開銷和泄漏。

例如:

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?
}

和向量類:

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);

我該如何對構造函數進行編碼,使其不執行任何操作……不好? 我以為它將創建一個新類,但是在上面的句子中使用它后,我將沒有任何方法可以引用它,這以后會導致問題嗎?

您的實現沒有任何泄漏。 超出函數范圍時,創建的每個向量都會被破壞。

至於返回值,建議您按值返回(只需刪除&即可)。

關於第二個問題:這不是新產品,所以沒有泄漏。 另外,您不需要引用它,因此沒有實際問題。

創建operator-作為名稱空間作用域函數(而不是成員函數):

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

  // Subtract out rhs
  ...

  // Do the math
  return result;
}

在任何情況下都不會泄漏任何內容,因為您還沒有從堆中分配任何東西(免費存儲)。

測試1將答案存儲在新的向量(結果)中,並假設將其返回作為對rVector的引用。

rVector = result

aVector = //its original value

測試2將答案存儲在調用了函數(aVector)的向量中,並將其返回作為對rVector的引用。

rVector = aVector

aVector = //the answer

盡管使用測試2將節省內存,但答案存儲在函數外部的兩個位置(rVector和aVector),這可能不是您想要的。 測試1是更安全的選擇,但請確保按值返回它,以避免此處其他人指出的范圍外錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM