3

これは私の以前の質問の続きです。

私はこのようなObjective-Cコードをたくさん持っています:

typedef long DataKey;

DataKey x;
DataKey y;

if (x == y) {
    // do stuff
}

DataKeyの代わりにオブジェクトに変更する必要がありますlong。クラスを作成し、一連のグローバル検索と置換を実行すると、コードは次のようになります。

@interface DataKey : NSObject

DataKey *x;
DataKey *y;

if (x == y) { // uh-oh - this is now bad, I need isEqual: here
}

2つのオブジェクトポインタで演算子を使用して検出するコンパイラの警告がない==ため、別の解決策を探しています。

1つの考えは、C ++クラスを使用==し、コンパイラーが文句を言うような方法で演算子をオーバーロードすることでした。

私はObjective-CほどC++を知りません。私はC++クラスを書くことができ、実際にoperator==メソッドが呼び出される結果となるコードができました。コンパイラの警告が表示されるように、コードを微調整する方法を考え出すのに助けが必要です。

C++クラスは次のとおりです。

class DataId {
public:
    DataId();

    bool operator==(const DataId &other);
};

これで、次のようなObjective-C++コードができました。

DataId x;
DataId y;

if (x == y) { // I need a compiler warning/error here
}

ifステートメントでコンパイルエラー/警告を引き起こすために思いつくことができる構文上のトリックはありますか?

4

3 に答える 3

4

をまったく定義しないようにしたことがありoperator==ますか?operator==C++クラスには暗黙的なものはないと思います。したがって、の定義を省略した場合、最後のコードスニペットはコンパイラエラーをスローするはずですoperator==

于 2012-12-06T02:49:03.720 に答える
1

operator==未定義でプライベートにするだけでエラーが発生します。しかし、2つのオブジェクトを比較したい場合、必要に応じてを定義しない理由がわかりませんoperator==

bool operator==(const DataId &other){
    return IsEqual(other);//is this the function you want to compare with?
}
于 2012-12-06T02:49:11.637 に答える
-1

C ++ 11にアクセスできる場合は、static_assertを使用できます。

class DataId {
    // ...

    bool operator==(const DataId& other)
    {
        static_assert(false, "enter error message here.");
        return true;
    }
};

演算子==をまったく定義しないでください。コンパイラは、使用時にエラーで失敗します。

于 2012-12-06T02:46:52.390 に答える