9

Javaのようなものはありますequals()か?オブジェクトが同じタイプかどうかを比較するには?

public boolean equals(Object obj) {
    if (obj == null || !(obj instanceof ViewMode)) {
        return false;
    }

    ViewMode dm = (ViewMode) obj;
    return dm.width == w
        && dm.h == h
        && dm.b == b
        && dm.f == f;
}

public int hashCode() {
    return w ^ h ^ f  ^ b ;
}
4

4 に答える 4

15

あなたの例の慣用的な同等物については、次のように定義operator==します。

friend bool operator==(const ViewMode &lhs, const ViewMode &rhs) {
    return (lhs.w == rhs.w) && the rest;
}

friend bool operator!=(const ViewMode &lhs, const ViewMode &rhs) {
    return !(lhs == rhs);
}

C++ では、通常、ViewModeオブジェクトとまったく関係のないものとオブジェクトを比較できるようにする関数を作成しませんViewMode。コンパイルを拒否するのではなく、その比較で false を返すことが本当に必要な場合は、いくつかのテンプレート演算子を (フリー関数として、クラスの外に) 追加できると思います。

template <typename T>
bool operator==(const ViewMode &, const T&) {
    return false;
}

template <typename T>
bool operator==(const T &, const ViewMode&) {
    return false;
}

しかし、私は本当にそれをお勧めしません。Java のイディオムは C++ には当てはまりません。C++ ではほとんどの場合、オブジェクトを持つべきではなく、その型がわからないからです。

equals 関数を仮想関数にしたい場合は、equals()仮想関数を使用するのではなく、仮想関数を作成することをお勧めしますoperator==。asパラメータを取るように書くので、チェックconst ViewObject &に相当するものは必要ありません。instanceofC++ には、まったく未知の型のオブジェクトを取得して、それが指定された型のインスタンスであるかどうかをテストする方法がないためです。

C++ でポリモーフィック equals 関数が必要になることはめったにありませんが、たとえば で使用している場合はstd::unordered_map、追加のテンプレート パラメータをunordered_map. 2 つのポインターを取りequals、どちらか一方を呼び出す等値比較関数と、適切な処理を行うハッシュ関数を指定します。

于 2012-06-11T13:43:26.757 に答える
13

いいえ、C++ には Java のようなグローバル型モデルはありません。他Objectのすべての型が継承する型は存在しないequalsため、すべてのクラスに対して定義されるメソッド ( など) はありません。

C++ は、ユニバーサル比較操作を使用して型モデルを構築するためのフレームワークを提供します: operator ==. これらが正しく相互作用するように、すべてのクラスでこれのすべての実装を構築するのはあなた次第です。しかし、に匹敵するデフォルトの実装はありませんObject.equals

于 2012-06-11T13:24:32.757 に答える
5

operator==をクラスで定義できます。

于 2012-06-11T13:26:17.533 に答える
1

typeidこれには演算子を使用できる場合があります。

于 2012-06-11T13:26:57.117 に答える