Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;检查struct是否为NULL或未设置,即使其have运算符相等_C++_Struct_Null - Fatal编程技术网

C++ C++;检查struct是否为NULL或未设置,即使其have运算符相等

C++ C++;检查struct是否为NULL或未设置,即使其have运算符相等,c++,struct,null,C++,Struct,Null,我有一个包含许多成员的结构,还有一个运算符重载== 像这样: struct Adjustment { ObjectNumber aD; Foo afoo; bool operator == (const Adjustment& aAdjustment) const { return (aAdjustment.ID == ID); } }; 在代码中,我有: if(someAdjustment == NULL) 它

我有一个包含许多成员的结构,还有一个运算符重载== 像这样:

struct Adjustment {
    ObjectNumber aD;     
    Foo        afoo;  

    bool operator == (const Adjustment& aAdjustment) const
      { return (aAdjustment.ID == ID); }

  };
在代码中,我有:

if(someAdjustment == NULL)
它给了我:

error C2678: binary '==' : no operator found which takes a left-hand operand of type 'Unit::Adjustment' (or there is no acceptable conversion)

因此,我的问题是,如何在不更改其代码的情况下检查此结构是否已设置?

您只能比较指向
NULL
的指针。调整本身永远不会为空。

您只能将指针与
NULL
进行比较。一个调整本身永远不会是null。

C++中,一个由<代码>和代码>表示的“引用”意味着方法的调用方有义务为您提供一个对象实例。在没有对象的情况下,无法(正常)调用方法。您可以自由地假设,如果调用了您的函数,aa调整将被设置为某个值

但是,这里有两个gothas:

(1) 它将被设置为某物,但“某物”是否有意义?调整结构完全归零是否为您的功能的有效值?如果不是,那么您可以测试它,而不是测试空值。如果任何结构值组合无效-将其用作鉴别器。如果所有可能的值都是有效的,那么就没有什么需要检查的了

(2) 如果你知道黑暗之路(tm),你实际上可以传递一个空引用给这个函数。因此,您的代码不能仅仅因为“您使用了引用&”而“不受空值的影响”。然而,正如我所说的,使用&you清楚地声明不允许空值。知道黑暗之路(tm)的调用方可能只会在函数崩溃时责备自己

免责声明:“正常”和“黑暗之路”只是用来掩盖真正专业解释的额外复杂性的流行语。如果您稍微使用casting和*/&操作符,您将很快发现如何获取指向零地址的“int&boom”。这既不是“黑暗”也不是“魔法”,而是语言和平台的简单特性。然而,(a)新手程序员甚至有经验的程序员往往不知道引用可以是空的,并且(b)不通过NULL的约定是真正已知和解决的,所以(A+B)请适应约定,并在适当的地方自由使用。

< P> C++,“引用”用
&
表示意味着方法的调用方有义务向您提供对象实例。在没有对象的情况下,无法(正常)调用方法。您可以自由地假设,如果调用了您的函数,aa调整将被设置为某个值

但是,这里有两个gothas:

(1) 它将被设置为某物,但“某物”是否有意义?调整结构完全归零是否为您的功能的有效值?如果不是,那么您可以测试它,而不是测试空值。如果任何结构值组合无效-将其用作鉴别器。如果所有可能的值都是有效的,那么就没有什么需要检查的了

(2) 如果你知道黑暗之路(tm),你实际上可以传递一个空引用给这个函数。因此,您的代码不能仅仅因为“您使用了引用&”而“不受空值的影响”。然而,正如我所说的,使用&you清楚地声明不允许空值。知道黑暗之路(tm)的调用方可能只会在函数崩溃时责备自己



免责声明:“正常”和“黑暗之路”只是用来掩盖真正专业解释的额外复杂性的流行语。如果您稍微使用casting和*/&操作符,您将很快发现如何获取指向零地址的“int&boom”。这既不是“黑暗”也不是“魔法”,而是语言和平台的简单特性。然而,(A)新手程序员,甚至有些经验的程序员往往不知道引用可以为null,并且(B)&-means don pass null的约定是众所周知的,并且已经确定,因此(A+B)请适应该约定,并在适当的情况下随意使用它。

您期望/希望发生什么?您不能将对象与
NULL
进行比较,只能将指针进行比较(好的,您可以将整型与
NULL
进行比较,但在此不进行讨论)。调整的类型是什么-如果是对象或引用,除非重载运算符==将指针作为rhs,否则比较没有意义。它是作为函数args的引用传递的对象,函数args是“set”的定义。引用不能为
NULL
!你期望/希望发生什么?您不能将对象与
NULL
进行比较,只能将指针进行比较(好的,您可以将整型与
NULL
进行比较,但在此不进行讨论)。调整的类型是什么-如果是对象或引用,除非重载运算符==将指针作为rhs,否则比较没有意义。它是作为函数args的引用传递的对象,函数args是“set”的定义。引用不能为
NULL
!我只是想用一种方法来检查对象是否正确set@user63898您不能有未设置的调整实例。在
C++
@user63898中没有这样的术语,除非你给类一个方法来知道它是否被设置了。或者使用
boost::optional
@IvayloStrandjev拥有该类型的成员不是一个好主意;如果类型没有默认构造函数会发生什么情况?@quetzalcatl实际上,
boost::optional
是因为这个习语已经在名为
Fallible
下被广泛使用了(我也看到了
可能是
的最佳名称,除非你想针对某个特定用途).我只是想看看这个物体是否set@user63898您不能有未设置的调整实例。在
C++
@user63898中没有这样的术语,除非你给类一个方法来知道它是否被设置了。或者使用
boost::optional
@IvayloStrandjev拥有该类型的成员不是一个好主意;如果类型没有默认构造,会发生什么