继承我的班级
class Vector
{
public:
Vector();
Vector(float x, float y, float z);
float x;
float y;
float z;
Vector &operator+(const Vector &other) const;
Vector &operator+=(const Vector &other);
Vector &operator*(float n) const;
};
//op overloading functions impl
Vector &Vector::operator+(const Vector &other) const
{
Vector result = *this;
result.x += other.x;
result.y += other.y;
result.z += other.z;
return result;
}
Vector &Vector::operator+=(const Vector &other)
{
this->x += other.x;
this->y += other.y;
this->z += other.z;
return *this;
}
Vector &Vector::operator*(float n) const
{
Vector result = *this;
result.x *= n;
result.y *= n;
result.z *= n;
return result;
}
在尝试使用更复杂的方程式时,我得到的结果不正确。例如,这个工作:
Vector vChange = velocity * time;
position += vChange;
虽然这是DOESNT:
position += velocity * time;
即。它编译并运行,但写了一些虚假的位置
这个相同:
Vector& Reflect(const Vector& I, const Vector& N)
{
Vector v = I - 2 * Dot(N, I) * N;
}
你能告诉我我做错了什么吗?谢谢!
答案 0 :(得分:5)
您将在operator*
中返回对局部变量的引用。这是未定义的行为。而是按价值返回:
Vector Vector::operator*(float n) const
{
Vector result = *this;
result.x *= n;
result.y *= n;
result.z *= n;
return result;
}
operator+
相同。
答案 1 :(得分:2)
对于operator*
和operator+
,您必须按值返回Vector
,而不是按引用返回。你所拥有的是返回一个悬空引用,这是未定义的行为。
答案 2 :(得分:1)
您正在返回对局部变量的引用。不要那样做。您的非分配运算符应按值返回,而不是按引用返回。