3

演算子==をそのようにオーバーロードしたクラスがあるとします。

Class A {
  ...
  public:
    bool operator== (const A &rhs) const;
  ...
};

...

bool A::operator== (const A &rhs) const {
  ..
  return isEqual;
}

私はすでに演算子==に適切なブール値を返させています。ここで、これを単純な反対()に拡張したいと思い!=ます。==オーバーロードされた演算子を呼び出して、反対の、つまり性質の何かを返したいと思います

bool A::operator!= (const A &rhs) const {
  return !( this == A );
}

これは可能ですか?私thisはうまくいかないことを知っていますが、それは私が欲しいものを例示しています。呼び出しのパラメーターを1つだけ保持したいと思います:rhs。何度か検索を試みても答えが出なかったので、助けていただければ幸いです。

4

2 に答える 2

9

あなたはほとんどそれを持っていました:

bool A::operator!= (const A &rhs) const {
  return !( *this == rhs );
}

これはオブジェクトではなく、ポインタでthisあることに注意してください。逆参照する必要があります。関連する注意点として、通常、ほとんどの二項演算子は、メンバー関数ではなく、自由関数として実装する方が適切です。

于 2012-09-04T21:37:47.410 に答える
4

個人(クラスごと)で行う必要はありません。

標準ライブラリは、ユーザー提供の演算子とに依存する演算子、、、!=およびの「デフォルト」テンプレート実装を宣言することにより、このアプローチのサポートをすでに提供しています。これらの宣言はヘッダーにあり、名前空間で囲まれています。><=>===<<utility>std::rel_ops

これらの実装は名前空間std::rel_opsで宣言されているため、デフォルトでは名前検索では見つかりません。プログラムでこれらの定義を「アクティブ化」する場合は、次のようにします。

#include <utility>
using namespace std::rel_ops;

たとえば、これにより、変換ユニット内のすべてのクラス!=の演算子の実装から演算子が自動的に導出されます。特定のクラス==に演算子の明示的な実装を提供することで、メカニズムをオーバーライドできます。!=

于 2012-09-04T21:45:56.003 に答える