重载> =运算符来比较指针

时间:2018-06-11 21:55:46

标签: c++ pointers operator-overloading

我正在尝试将>=运算符重载到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>=调试消息。

2 个答案:

答案 0 :(得分:4)

您几乎总是想要比较实际的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<以用于标准算法,那么您必须确保它执行“严格的弱”&#34;比较,你目前的比较不是(现在,有A和B的值(例如,{4,5}和{5,4}),因为A&gt; = B和B&gt; = A将返回false,表示A既不小于,也不等于,也不大于B.像这样的比较运算符可以(通常会)从排序算法等事物中产生未定义的行为。

答案 1 :(得分:1)

要从指向对象的指针调用类的成员函数,请使用以下方法。 假设Point类中还有另一个名为cmp的函数,该函数将指针作为参数。

bool Point::cmp(Point *p)
{
return true;
}

它可以由(*p1).cmp(p2)的指针p1调用。

类似地,重载的运算符> =也可以通过以下方式调用:

bool result = *p1 >= p2;