c++ - 重载 >= 运算符来比较指针
问题描述
我正在尝试将>=
运算符重载到 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>=
调试消息。
解决方案
您几乎总是想比较实际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 比较像这样的运算符可以(并且经常会)从排序算法之类的东西中产生未定义的行为。
推荐阅读
- java - 在 Java 8 中减少集合
- azure - 在发票表中使用资源 GUID 映射 Azure 资源标记
- javascript - 打字稿最大调用堆栈大小超出错误
- java - 导入 org.apache.poi.xssf.usermodel.XSSFWorkbook 时出现问题;在硒 Java 项目中
- rust - Rust wasm:缺少在外部 crate 中定义的导出函数
- python - PyCharm 突出显示导入模块的行
- vim - Neovim 中的默认值不正确:无法创建备份文件(添加!覆盖)
- c - 宏未到达 .c 文件
- azure - Azure CD 管道找不到生成项目
- ios - 嵌入式 @Binding 不会更改值