与空(类似null)结构相等

时间:2014-02-04 03:58:45

标签: c++ struct

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的结构。

5 个答案:

答案 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)

虽然这是一件相当奇怪的事情;如果你想要一个可以类似于引用的类型,那么使用一个定义为“无对象”的明确定义的空值通常更有意义。

==!=用于比较值,而不是对象标识,如果要为类类型定义它们,则必须重载。