2016-05-27 2 views
3

В C++, как функции перегрузки оператора отличаются для унарных и двоичных операторов-минусов?Как перегрузить как унарные, так и двоичные операторы минус в C++?

Я пытаюсь перегружать как с помощью следующего кода:

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

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

Но это извергает много ошибок:

vector.cpp: In member function ‘Vector Vector::operator-(const Vector&)’: 
vector.cpp:88:20: error: passing ‘const Vector’ as ‘this’ argument of ‘Vector 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

ответ

5

1. v передается по ссылке на const, его нельзя вызывать с помощью функции не-const-члена. Поскольку operator- и operator+ (как унарная, так и двоичная версия) не изменяют членов класса, вы должны создавать их функции-члены-члены.

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

2.Изменение

return this* + (-v); 

к

return *this + (-v); 
+0

Благодаря! Каково объяснение второго пункта? – brandbest1

+0

@ brandbest1 Это просто синтаксическая ошибка. 'this * + (-v);' будет вызывать унарный 'operator-' on 'v' и вызывать унарный' operator + 'на возвращаемом значении, а затем сбой, поскольку вы определяете только двоичный' operator + '. '* this + (-v)' будет вызывать унарный 'operator-' on 'v', а' * this' будет разыменовывать 'this', а затем вызывает с ними двоичный' operator + '. – songyuanyao

Смежные вопросы