43

これはベストプラクティスです(この場合):

bool Foo::operator==(const Foo& other) {
  return bar == other.bar;
}

// Implementation 1
bool Foo::operator!=(const Foo& other) {
  return bar != other.bar
}

// Implementation 2
bool Foo::operator!=(const Foo& other) {
  return !(*this == other);
}

>、<、<=、>= などの演算子については、可能であれば実装 2 を使用します。ただし、!= については別のメソッド呼び出しを行わないので実装 1 の方が良いと思いますが、これでよろしいでしょうか?

4

5 に答える 5

37

==2番目の実装には、常に反対のブール値になる注目すべき制約があり!=ます。これはおそらくあなたが望むものであり、2つを同期させるために1つの実装を変更するだけでよいため、コードの保守が容易になります。

于 2012-05-13T22:39:20.323 に答える
17

比較演算子をオーバーロードするときは、常に持っているものを使用する必要があります。定義する必要があるのはoperator==とだけoperator<です。あなたがこれらの2つの観点から書くことができる残りの部分。エラーが発生しにくく、間違いがあるかのように、1か所にしかありません。

OOPの主な機能の1つは、コードの再利用性です。すでにコードを書いているのなら、なぜもう一度書くのですか?あなたが持っているものに固執すれば、テストするものは1つだけになります。

これは、定数を宣言してから、ファイル全体のいくつかの場所でそれを使用するようなものです。

于 2012-05-13T22:37:26.720 に答える
4

実装2は、すでに定義されているoperator ==を使用するため、より優れています。また、これらの演算子関数はconst、オブジェクトを変更しないためである必要があります。

于 2012-05-13T22:39:51.727 に答える
3

上記のどれでもない。

これを本当に詳しく説明している論文を見つけられたらいいのにと思いますが、名前が思い出せません。

比較操作は外部で行う必要があります。インターフェイスはオブジェクトの状態を見つけるのに十分である必要があり、オブジェクトの状態が比較を指示する必要があります。あなたのクラスの外で「等しい」を書くことが可能であるはずです、そしてそれでどんな比較でも本当に、そしてそれは可能です...あなたはしたいです。

于 2012-05-14T00:33:51.750 に答える
2

一般に、実装2は多くの理由で優れています。まず第一に、(ほとんど)重複したコードを書かないでください。変更する必要がある場合(クラスが大きくなった、またはバグがあったため)、実装2でも1か所だけ変更します。つまり、実装2により、コードの一貫性が高まり、エラーが発生しにくくなります。

于 2012-05-13T22:40:00.483 に答える