【发布时间】:2026-01-17 02:10:01
【问题描述】:
我需要能够将我的一个类(它包含的远不止一个整数)与整数进行比较,即使这可能会稍微扩展相等性,但它已经足够接近了......
如何为不同类型重载相等运算符?
我基本上都有这样的课
struct MyClass {
int start;
int middle;
int threequarters;
};
和重载的运算符
inline bool operator==(const MyClass& lhs, const MyClass& rhs) {
return lhs.middle == rhs.middle;
}
所以当与整数进行比较时,我还需要与中间变量进行比较,但我不确定我是否需要两组运算符函数,一组整数是 lhs,一组整数是 rhs?
inline bool operator==(const int& lhs, const MyClass& rhs) {
return lhs == rhs.middle;
}
inline bool operator==(const MyClass& lhs, const int& rhs) {
return lhs.middle == rhs;
}
【问题讨论】:
-
是的,你应该这样做 - 支持 (int,MyClass) 和 (MyClass,int)。尽管您可以根据另一个运算符来定义其中一个运算符。另一种可能性是有一个 MyClass 的构造函数,它从 int 构造 - 然后你只需要一个 operator(MyClass,MyClass) 因为当编译器遇到 int 时,它可以将它提升为运算符的 MyClass 类型。
-
所以要比较 MyClass 和 MyClass,以及整数和 MyClass,我需要每个比较函数 3 组(总共 18 个),即使它们中的大多数会引用其他函数..?
-
或者给你的类一个转换构造函数
MyClass(int i) : middle(i) {}。 -
重载比较运算符以使其不比较对象的所有部分对我来说似乎是不好的做法。如果你想要这样的函数,我宁愿只定义一个函数,其名称描述它的作用,例如
bool areEqualAtMiddle(const MyClass& lhs, const MyClass& rhs) -
@ChrisDrew 是的,我知道,只是我将这些
MyClass存储在一个集合中,并且在执行期间的某些时候我只能访问中间值,所以我需要取回引用不知怎的……
标签: c++ operator-overloading comparison-operators