Перегрузка оператора сравнения своего класса в C++ Builder 6
Пытаюсь перегрузить оператор сравнения своего класса:
class Square {
int x;
// some data
public:
// some methods
int getX() {return x;}
bool operator== (Square &sq);
};
bool Square::operator== (Square &sq) {
int x1 = this->getX();
int x2 = (&sq)->getX();
if (x1 == x2) return true;
return false;
}
Но при попытке вызова сравнение работает некорректно. Ошибки не вылетают, но получить истину нельзя. Для теста убирала из оператора все, кроме возврата, но даже так истины не случалось:
bool Square::operator== (Square &sq) {
return true;
}
Думала, проблема в том, что программа не видит перегрузки, но если дописать второй параметр, builder начинает ругаться E2080 'Square::operator== (Square &, Square &)' must be declared with one parameter. Получается, перегрузку видит, но не пользуется...
Вызов:
Square *square1 = new Square();
Square *square2 = new Square();
if (square1 == square2) {
// some code
}
Ответы (1 шт):
Вы сравниваете указатели, а не объекты класса.
Можно сделать так: *square1 == *square2.
Но лучше убрать ненужный new и делать вот так:
Square square1;
Square square2;
if (square1 == square2) {...}
Еще, забыт const в нескольких местах. Правильно так:
int getX() const {return x;}
bool operator==(const Square &sq) const;
Еще, вот это:
int x1 = this->getX();
int x2 = (&sq)->getX();
if (x1 == x2) return true;
return false;
Упрощается до return getX() == sq.getX();
И еще, в современном C++ можно вписать в класс вот такую волшебную конструкцию:
friend auto operator<=>(const Square &, const Square &) = default;
И автоматически сгенерировать все 6 операторов сравнения: ==, !=, <, <=, >, >= - чтобы не писать их руками.