所以我一直在用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;
}
我也重载了+和=运算符,它们按预期工作,我遇到的唯一问题是上面的问题。
答案 0 :(得分: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);
}