#c #operator-keyword
#c #operator-ключевое слово
Вопрос:
Я создал operator для !=
PairXY operator != (PairXY a, PairXY b) {
PairXY res(a.x != b.x, a.y != b.y);
return res;
}
И я хочу использовать его в этом цикле:
while (l.b!=l.a){}
Но это выдает мне эту ошибку: не удалось преобразовать ‘operator!= (l.Line::b, l.Line::a)’ в ‘bool’, я попытался изменить PairXY оператора на bool, но это все еще не помогло.
Комментарии:
1. Можете ли вы показать определение
PairXY
?2. Вероятно, это должно выглядеть так:
bool operator!=(const PairXYamp; a, const PairXYamp; b) { return !(a == b); }
— другими словами, повторно используйте==
оператор, который ожидается, если вы предоставите!=
Ответ №1:
bool operator != (PairXY a, PairXY b) { … }
Ответ №2:
Возвращаемый тип должен быть bool
:
bool operator != (const PairXY amp; a, const PairXY amp; b);
Кроме того, лучше сделать параметры const
ссылочными, как я показал выше.
Комментарии:
1. Помните, что если вы не поставите
amp;
, вы вызовете copy-constructor.const
позволяет использовать его для объектов const, если они у вас есть.2. @Shahbaz: Да. Вот почему я поставил
amp;
.
Ответ №3:
Вы хотите вернуть пару (вероятно) чисел или одно логическое значение?
Обычно кортежи отличаются (математически), когда какой-либо компонент попарно отличается. Итак, я бы закодировал что-то вроде
bool operator != (PairXY a, PairXY b) { return a.x != b.x || a.y != b.y; }
но, возможно, вы хотите что-то еще (но тогда я не буду это называть !=
).
Комментарии:
1. @JeremyFriesner: Свободная функция не может быть объявлена
const
.
Ответ №4:
Вероятно, именно таким и должен быть ваш код.
class PairXY {
public:
PairXY( int _x, int _y): x(_x),y(_y){}
bool operator != (const PairXY a) {
return(this->x != a.x amp;amp; this->y != a.y);
}
private:
int x;
int y;
};
int main ( int argc, char** argv ) {
return 0;
}
Комментарии:
1. Это не сработало бы для этого, если
a
естьconst
в выраженииa!=b
.