我模糊地重载了我的vector(数学)类的成员函数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%清楚地思考。
编辑:现在让它工作,只需将减法运算符修改为友元函数。
答案 0 :(得分:3)
您应该将operator-
定义为
vector operator-(const vector &lhs, const vector &rhs)
{
return vector(lhs.mx - lhs.my, rhs.mx - rhs.my);
}
编译器尝试使用一元operator-
,因为它适用于const向量。
当你写vector c = a - b;
并且a和b是const向量时,编译器会查找它找不到的上述函数。它只找到一个没有常量参数的运算符。由于您不修改参数,因此将它们定义为const。
您添加的const
关键字无效后。它应该只出现在方法中,并指定该方法不修改该对象。编译器应该使用函数定义来抱怨它的存在。