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