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 が何かに設定されると想定するのは自由です。

ただし、ここには 2 つのゴータがあります。

(1)何かに設定されますが、その「何か」に意味はありますか?調整構造体は完全にゼロに設定されていますが、関数の有効な値ですか? そうでない場合は、代わりに無効性をテストすることができます。構造値の組み合わせが無効な場合は、これを識別子として使用します。可能なすべての値が有効な場合、チェックする必要はありません。

(2) 裏技 (tm) を知っているなら、実際にこの関数にヌル参照を渡すことができます。したがって、「参照を使用した」という理由だけで、コードは「null から安全」ではありません。ただし、私が言ったように、 & を使用すると、ヌルを許可しないことを明確に述べます。暗黒の道 (tm) を知っている呼び出し元は、関数がクラッシュしたときにのみ自分を責める可能性があります。

免責事項:「通常」と「暗い方法」は、実際の専門的な説明の複雑さを隠すための流行語にすぎません. キャストと */& 演算子を少し試してみると、ゼロアドレスを指す「int&boom」などを取得する方法がすぐにわかります。これは「闇」でも「魔法」でもなく、言語とプラットフォームの明白な機能です。ただし、(A) 初心者のプログラマーや多少の経験を積んだプログラマーでさえ、参照が null になる可能性があることを知らない傾向があり、(B) &-means-dont-pass-null の規則は非常によく知られており、定着しているため、(A+B ) 慣例に合わせて、適切な場所で自由に使用してください。

于 2013-03-19T14:51:35.320 に答える
2

へのポインターのみを比較できますNULL。調整自体が NULL になることはありません。

于 2013-03-19T14:45:57.280 に答える