繁体   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