Использование перегрузки операторов внутри функции с входными параметрами константного типа в c ++ - PullRequest
1 голос
/ 02 декабря 2019

Пожалуйста, рассмотрите следующий код:

#include <iostream>
using namespace std;

class vec {
  public:
    float x,y;

  vec(float a, float b) {
    x = a;
    y = b;
  }

  const vec operator + (const vec & a) {
    vec ResVec(0.0f, 0.0f);
    ResVec.x = x + a.x;
    ResVec.y = y + a.y;

    return ResVec;
  }

};

vec foo(const vec& v1, const vec& v2)
{
    const vec temp(2.0f,2.0f);
    return v1 + v2 + temp;
}

int main() {
  vec v1(1.0f, 1.0f);
  vec v2(2.0f,2.0f);
  vec v3(0.0f,0.0f);

  v3 = foo(v1,v2);
}

Запустите приведенный выше код онлайн

Я хочу реализовать функцию foo с постоянными входными параметрами. Но я терплю неудачу, потому что компилятор говорит: ошибка: нет совпадения с оператором + (типы операндов - const vec и const vec), возвращают v1 + v2 + temp. Как я могу изменить оператор перегрузки, чтобы я мог использовать оператор + в функции

vec foo(const vec& v1, const vec& v2)

1 Ответ

2 голосов
/ 02 декабря 2019
 const vec operator + (const vec & a) {

Эта перегрузка возвращает const vec. Не vec. Это важно.

     v1 + v2 + temp;

Первый оператор сложения, таким образом, возвращает const vec. Второй оператор сложения попытается добавить const vec к vec. Однако перегрузка не является методом класса const, поэтому ее нельзя вызывать для объекта const (это не является технически точным объяснением на 100%, см. Ниже, но его легче понять в этом примере).

Просто измените перегрузку следующим образом:

 const vec operator + (const vec & a) const {

Так и должно быть, поскольку в this ничего не изменяется. Есть и другие причины, по которым эта перегрузка должна быть методом класса const;легче понять, почему в этом случае, учитывая тот факт, что const vec возвращается. Вы также можете объявить эту перегрузку как возвращаемую vec вместо const vec, но это не материальная проблема (по другой причине произойдет та же ошибка компиляции).

Когда дело доходит до объявленияПерегрузки операторов, применяется следующее правило: если перегруженный оператор ничего не изменяет в this, вы должны объявить его как const метод класса.

...