我模棱两可地重载了operator-
我的向量(数学)类的成员函数。
我可以解决这个问题吗?目前,我对如何进行有点困惑。
代码:
class vector
{
double mx, my;
// Constructor not written for clarity
vector operator-() const;
friend vector operator-(vector &lhs, vector &rhs);
}
vector vector::operator-() const
{
return vector(-mx, -my);
}
vector operator-(vector &lhs, vector &rhs) const // Note const here!
{
return vector(lhs.mx - lhs.my, rhs.mx - rhs.my);
}
如果您需要知道构造函数是什么,这只是预期的:
vector::vector(double x, double y)
{
mx = x; my = y;
}
问题标记的代码行是:
vector a(0.0, 0.0);
vector b(0.0, 0.0);
vector c = a - b;
这应该是足够的信息来详细描述问题。还有一个默认副本operator=
。
问题当然是编译器不知道我是要减去这些向量还是取反,然后由于vector c = vector vector
或vector c = a b
如果您愿意,会出现编译器错误,这是无意义的代码。
编辑:我错过了一条非常重要的信息,我现在意识到它解释了问题:
有问题的代码行出现在参数作为 const 引用传递的函数中。
void function(const vector &a, const vector &b)
{
vector a(0.0, 0.0);
vector b(0.0, 0.0);
vector c = a - b;
}
这并不是一个特别的问题,但是我上面写的函数实际上应该是用于operator-=
. (减法)然后根据operator-
定义operator-=
。所以要充分解释,这就是问题所在:
vector& vector::operator-=(const Vector3& rhs)
{
m_x -= rhs.m_x;
m_y -= rhs.m_y;
return *this;
}
vector operator-(vector &lhs, vector &rhs)
{
lhs -= rhs;
return lhs;
}
这解释了问题 - 函数operator-
(否定)承诺不会通过使用来修改成员const
,并且其他 2 个减法运算符是相互定义的。我认为解决方案是执行以下操作:
vector operator-(vector &lhs, const vector &rhs)
{
vector v = lhs;
v -= rhs;
return lhs;
}
或者,如果不是这样,那么也许是更详细的方法:
vector operator-(const vector &lhs, const vector &rhs)
{
vector v = vector(lhs.mx - lhs.my, rhs.mx - rhs.my);
return v;
}
我现在要测试一下——我现在有点头疼,所以我想我一定没有 100% 清楚地思考。
编辑:现在可以工作了,只需将减法运算符修改为友元函数。