首页 > 解决方案 > 重载 >= 运算符来比较指针

问题描述

我正在尝试将>=运算符重载到 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,我总是得到 output false,并且它不会打印overloaded>=调试消息。

标签: c++pointersoperator-overloading

解决方案


您几乎总是想比较实际Point对象,而不是指向 a 的指针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。A 比较像这样的运算符可以(并且经常会)从排序算法之类的东西中产生未定义的行为。


推荐阅读