перегрузка> = оператор для сравнения указателей - PullRequest
0 голосов
/ 12 июня 2018

Я пытаюсь перегрузить оператор >= в класс Point, чтобы я мог сравнить два указателя с экземплярами Point.Но он не выглядит, он вообще вызывает перегруженный оператор, потому что он не печатает выходные данные отладки.Почему перегруженный оператор не вызывается?Как заставить это работать?

Код, который я пытаюсь найти, находится в файле operator.cc:

#include <ios>
#include <iostream>

class Point {
    int x, y;
public:
    Point(int x, int y);
    int getX();
    int getY();
    bool operator>=(Point* p);
};

Point::Point(int x, int y) {
    this->x = x; this->y = y;
}

int Point::getX() {
    return this->x;
}
int Point::getY() {
    return this->y;
}

bool Point::operator>=(Point* p) {
    std::cout << "overloaded>=" << std::endl; // does not print anything
    return this->x >= p->getX() && this->y >= p->getY();
}

int main() {
    Point* p1 = new Point(5, 5);
    Point* p2 = new Point(4, 4);
    bool result = p1 >= p2;
    std::cout << std::boolalpha << result << std::endl;
    return 0;
}

Но когда я компилирую и запускаю этот код с g++ operator.cc -o op && ./op, я всегда получаювывод false, и он не печатает отладочное сообщение overloaded>=.

1 Ответ

0 голосов
/ 12 июня 2018

Вы почти всегда хотите сравнивать фактические Point объекты, а не указатель на Point.

bool Point::operator>=(Point const & p) {
    std::cout << "overloaded>=\n"; // should now print something
    return x >= p.x && y >= p.y;
}

Тогда вы вызываете его следующим образом:

int main() {
    Point p1{5, 5};
    Point p2{4, 4};
    std::cout << std::boolalpha << (p1>=p2) << '\n';
}

В качестве примечания: если вы поддерживаете сравнение в C ++, вместо этого (гораздо) чаще использовать перегрузку operator<.По умолчанию стандартные алгоритмы будут сравниваться для значений меньше, а не больше или равны.

Но, если вы решите внедрить operator< для использования со стандартными алгоритмами, вам придется убедиться, что он несет«строго слабое» сравнение, которое не является вашим текущим сравнением (как оно есть сейчас, существуют значения A и B (например, {4,5} и {5,4}) для A> = B иB> = A вернет false, указывая, что A ни меньше, ни равно, ни больше, чем B. Оператор сравнения, подобный этому, может (и часто будет) производить неопределенное поведение из таких вещей, как алгоритмы сортировки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...