代码之家  ›  专栏  ›  技术社区  ›  Luke 10X

重载>=用于比较指针的运算符

  •  1
  • Luke 10X  · 技术社区  · 8 年前

    我正试图超载 >= 运算符到点类,以便我可以比较两个指向点实例的指针。但它看起来根本不调用重载的操作符,因为它没有打印调试输出。 为什么不调用重载运算符?如何使其工作?

    我正在尝试的代码在文件中 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 回复  |  直到 8 年前
        1
  •  4
  •   Jerry Coffin    8 年前

    你几乎总是想比较实际情况 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< 相反。默认情况下,标准算法将比较小于,而不是大于/等于。

    但是,如果您决定执行 操作员< 对于标准算法的使用,您必须确保它执行“严格弱”比较,而您当前的比较不是这样的(现在的情况是,A和B的值(例如,4,5和123; 5,4),因为A>=B和B>=A都将返回false,这表明A不小于大于,不等于,也不大于b。类似于b的比较运算符可以(并且通常会)从排序算法之类的事物中产生未定义的行为。