具有空的(无效)结构的平等

Equality with an empty (null-like) struct

本文关键字:结构 无效      更新时间:2023-10-16

此处问题的答案解决了初始化null-reset或零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
}

尝试上述问题时会遇到的错误:

'operator!='在'x!= emptsumpstruct'

中没有匹配

edit :为了使其更加清楚,我了解结构的超载!=运算符的错误消息,但是由于empterments是一种特殊的类型,我该如何处理?<<<<<<<<<<<<<<<<<</p>

我想重点是我类型的结构A = 0和B = 0与应代表null样结构的空台面不同。

您真的需要下定决心,无论您的MyStruct是值类型还是身份类型。

如果是一个值类型,那么您要定义其价值的某个部分,因为它是空的:

struct MyStruct { 
    int x;
    int y;
    bool empty;
};

如果是身份类型,则要检查身份:

void myFunction(MyStruct &m) {
    if (&m == &EmptyStruct)
        // reference to EmptyStruct. Act accordingly.
}

如果您需要像空中台面这样的单数值,则可能需要考虑通过(智能)指针,并与nullptr进行比较以确定您是否收到了单数值。

作为一般规则,我通常会避免使用这种类型的设计。身份类型对大多数C 程序员来说都是陌生的,而单数值创建的特殊情况通常是您最好的情况。

您需要超负荷相等运算符,测试结构的每个元素。

bool MyClass::operator==(const MyClass &other) const {
    ...  // Compare the values, and return a bool result.
  }

只需超载operator==(或operator!=)即可。或(由于默认情况下,struct的所有成员都是public),请检查结构内的所有元素。

由于您谈论的是您的结构是"空" - 没有这样的事情。创建对象时,应由构造函数自动分配其内存。如果要检查传递的结构是否静态EmptyStruct,请检查两者的地址。

由于您是通过参考来进行对象,因此我假设您要测试用户是否实际将全局EmptyStruct对象作为函数参数传递。可以通过比较地址来轻松实现:

void foo(MyStruct & x)
{
    if (&x == &EmptyStruct) { /* ... */ }
}

(这假定MyStruct不超载operator&。)

听起来您要测试x是否指与EmptyStruct相同的对象,在这种情况下,您要比较地址:

if (&x != &EmptyStruct)

尽管这是一件奇怪的事情。使用指针,如果您想要一个可用的参考式类型,则使用指定符号为"无对象"更有意义。

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