Перегрузка оператора сравнения своего класса в C++ Builder 6

Рейтинг: 0Ответов: 1Опубликовано: 01.05.2023

Пытаюсь перегрузить оператор сравнения своего класса:

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
}

Ответы

▲ 2Принят

Вы сравниваете указатели, а не объекты класса.

Можно сделать так: *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 операторов сравнения: ==, !=, <, <=, >, >= - чтобы не писать их руками.