如何在C++中重载一元和二元减号运算符?

4
在C++中,如何区分一元和二元减号运算符的重载函数?
我正在尝试使用以下代码同时重载两个运算符:
Vector Vector::operator-(){
  return Vector(-x,-y,-z);
}

Vector Vector::operator-(const Vector& v){
  return this* + (-v);
}

但是这会产生很多错误:
vector.cpp: In member functionVector Vector::operator-(const Vector&)’:
vector.cpp:88:20: error: passing ‘const Vectorasthis’ argument ofVector Vector::operator-()’ discards qualifiers [-fpermissive]
   return this* + (-v);
                    ^
vector.cpp:88:16: error: no match for ‘operator+’ (operand type is ‘Vector’)
   return this* + (-v);
                ^
vector.cpp:88:16: note: candidates are:
vector.cpp:70:8: note: Vector Vector::operator+(const Vector&)
 Vector Vector::operator+(const Vector& v){
        ^
...

我该如何解决这个问题?

2
将其实现为自由函数,而非成员函数。或者(如果您坚持要将其实现为成员函数),请将其标记为“const”成员函数,即Vector Vector::operator-(const Vector&)const;Vector Vector::operator-() const; - Andrew
1个回答

6

1. 如果使用传递给常量引用的v,则无法调用非常量成员函数。由于operator-operator+(包括一元和二元版本)不会修改类的成员,因此应将它们设为常量成员函数。

Vector Vector::operator-() const {
  return Vector(-x,-y,-z);
}

2.Change

return this* + (-v);

to

return *this + (-v);

@brandbest1 这只是一个语法错误。this* + (-v); 会在 v 上调用一元运算符 -,然后在返回的值上调用一元运算符 +,由于你只定义了一个二元运算符 +,所以失败了。*this + (-v) 会在 v 上调用一元运算符 -,然后对 *this 解引用,再与它们一起调用二元运算符 + - songyuanyao

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接