0

我有一个包含许多成员的结构,还有一个 == 的运算符重载,如下所示:

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)

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

4

2 回答 2

2

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

但是,这里有两个哥达:

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

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

免责声明:“正常”和“黑暗方式”只是隐藏真正专业解释的额外复杂性的流行词。如果您稍微使用一下强制转换和 */& 运算符,您将很快发现如何获得指向零地址的“int& boom”。这不是那么“黑暗”或“魔法”,它是语言和平台的明显特征。然而,(A) 新手程序员甚至有些有经验的程序员往往不知道引用可以为空,并且 (B) &-means-dont-pass-null 的约定是众所周知的并且已经确定,所以 (A+B ) 请适应约定,并在适当的情况下随意使用它。

于 2013-03-19T14:51:35.320 回答
2

您只能将指针与NULL. 调整本身永远不会为 NULL。

于 2013-03-19T14:45:57.280 回答