【发布时间】:2015-02-26 14:09:30
【问题描述】:
我模棱两可地重载了我的向量(数学)类的成员函数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% 清楚地思考。
编辑:现在可以工作了,只需将减法运算符修改为友元函数。
【问题讨论】:
-
这不应该是模棱两可的......
-
Borgleader 是对的。你有什么错误吗?
-
I can't repro your error你能提供一个最小的例子吗?
-
嗯,好的,让我再检查一下我的代码...
-
顺便说一句,缺少
const。
标签: c++ vector operator-overloading subtraction negation