c++ - 重载 operator< 不适用于 claas 的指针
问题描述
如何重载运算符“<”以使用指向类的指针?
静态类的 Operator< 可以正常工作,但对于指针,它不会返回正确的答案,而且似乎根本不起作用。
class Point
{
int x, y;
public:
bool operator< (const Point* &p) const
{
if (x == p->x)
return y < p->y;
else
return x < p->x;
}
bool operator< (const Point &p) const
{
if (x == p.x)
return y < p.y;
else
return x < p.x;
}
Point (int a, int b)
{
x = a;
y = b;
}
};
这里我测试重载功能。在这两种情况下,我的程序都应该返回false
.
Point* a = new Point(1,2);
Point* b = new Point(0,0);
Point c = Point(1,2);
Point d = Point(0,0);
cout<< boolalpha << (a<b) << '\n'; <- always returns true
cout<< boolalpha << (c<d) << '\n'; <- returns false
解决方案
您不能为仅内置类型(如operator+(int, double)
or operator<(int*
、 )重载运算符int*)
。这根本不可能。实际上,(a<b)
未指定 的行为,因为您正在比较两个不相关的指针(有关更多详细信息,请参阅此答案)。但是你可以:
- 在比较之前取消引用指针。
- 创建一个命名函数,
comparePointPointers
并将其用作常规函数。 - 创建智能指针,将它们包裹在您的指针周围,重载运算符以比较它们。
推荐阅读
- c# - GeckoFX45 如何缩小浏览器?
- javascript - 每次用户滚动回顶部时如何更改顶部图像
- html - 使用边框底部在 Span 中选择文本时文本选择跳跃
- bazel - 从 bazel 的存档中提取 deb 文件
- google-cloud-platform - GCP:通过 gcloud 命令列出但未描述的实例
- c# - C#将新文本添加到字符串而不复制它以前的值
- c# - SSMS 中的 SQL 查询有效,但在 C# 中无效
- django - 登录后Django重定向用户
- vuejs2 - Vuetables2 如何为 vue-client-table 中的特定数据添加动态样式
- mysql - Mysql GROUP BY 查询。按日期和小时显示数据