the question here地址的答案初始化空重置或零结构。
我怎样才能检查平等?
说我的struct x定义如下:
struct MyStruct {
int a;
int b;
};
和空结构:
static const struct MyStruct EmptyStruct;
如何检查引用x类型结构的函数内部的相等性?
void myFunction (... , MyStruct &x, ...){
//some code
if (x != EmptyStruct){ // this doesn't work (see error below)
}
//some code
}
我在尝试上述操作时遇到的错误:
'x!= EmptyStruct'中的'operator!='不匹配
编辑:为了让我更清楚,我理解了重载结构的!=运算符的错误信息,但由于EmptyStruct是一种特殊类型,我该如何处理?< / p>
我想重点是我的类型的结构a = 0和b = 0与EmptyStruct不同,它应该代表类似null的结构。
答案 0 :(得分:2)
你真的需要决定你的MyStruct
是值类型还是身份类型。
如果它是一个值类型,那么你想要定义它的一部分值,说它是空的:
struct MyStruct {
int x;
int y;
bool empty;
};
如果是身份类型,那么您要检查身份:
void myFunction(MyStruct &m) {
if (&m == &EmptyStruct)
// reference to EmptyStruct. Act accordingly.
}
如果您需要像EmptyStruct一样的单数值,您可能需要考虑传递(智能)指针,并与nullptr
进行比较以确定您是否收到了奇异值。
作为一般规则,我一般都会避免这种类型的设计。对于大多数C ++程序员来说,身份类型有些陌生,而奇异的值会创建一些特殊情况,通常情况下你会更好。
答案 1 :(得分:1)
您需要重载相等运算符,测试结构的每个元素。
bool MyClass::operator==(const MyClass &other) const {
... // Compare the values, and return a bool result.
}
答案 2 :(得分:0)
只需overload operator==
(或operator!=
)。或者(因为默认情况下struct
的所有成员都是public
),请检查结构中的所有元素。
既然你在谈论你的结构是“空的” - 那就没有了。创建对象时,构造函数应自动分配它的内存。如果要检查传递的结构是否为 静态EmptyStruct
,请检查两者的地址。
答案 3 :(得分:0)
由于您通过引用获取对象,我假设您要测试用户是否实际将全局EmptyStruct
对象作为函数参数传递。这可以通过比较地址轻松实现:
void foo(MyStruct & x)
{
if (&x == &EmptyStruct) { /* ... */ }
}
(这假定MyStruct
不会超载operator&
。)
答案 4 :(得分:0)
听起来你想测试x
是否与EmptyStruct
引用相同的对象,在这种情况下你要比较地址:
if (&x != &EmptyStruct)
虽然这是一件相当奇怪的事情;如果你想要一个可以类似于引用的类型,那么使用一个定义为“无对象”的明确定义的空值通常更有意义。
==
和!=
用于比较值,而不是对象标识,如果要为类类型定义它们,则必须重载。