使用C++中的重载*运算符与括号结果相乘

1 c++ overloading vector parentheses

所以我一直在用C++编写一个小的数学库,当处理一个标量乘以一个向量时,当我尝试执行这个操作时会遇到一些问题

Vect V2;
Vect V3;
float S;

Vect V1 = V2 + S * (V2 - V3);
Run Code Online (Sandbox Code Playgroud)

我在重载运算符*中收到的Vect值是一个新的Vect对象,而不是操作的(V2-V3)部分的结果.这是代码的其他相关部分.如果我按照调试操作,两个重载操作符本身可以正常工作,但不能一个接一个地工作.

Vect.h

Vect &operator - (const Vect &inVect);
friend const Vect operator*(const float scale, const Vect &inVect);
Run Code Online (Sandbox Code Playgroud)

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;
}
Run Code Online (Sandbox Code Playgroud)

我也重载了+和=运算符,他们按预期工作我遇到的唯一问题是上面的问题.

Jos*_*eld 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);
}
Run Code Online (Sandbox Code Playgroud)