0

我模棱两可地重载了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 vectorvector 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% 清楚地思考。

编辑:现在可以工作了,只需将减法运算符修改为友元函数。

4

1 回答 1

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关键字无效。它应该只与方法一起出现,并指定对象不被方法修改。编译器应该用函数定义来抱怨它的存在。

于 2015-02-26T14:48:08.707 回答