1

私はこれに苦労しています。個人的なプロジェクトのために、この演算子をオーバーロードする必要があると判断しました。次の行を使用することで必要になります。

if(playerVec[i] == 0)

プレーヤー クラスには、1 つの特定のデータ メンバー mInitiative を計算するための複数のデータ メンバーがあります。これは、if 条件で確認したいものです。オーバーロードする私の試みは次のとおりです。

bool operator==(const Player& lhs) const {
    return mInitiative == lhs.mInitiative;
}

問題ないように見えますが、エラーは続きます。その特定のプレーヤー データを整数 (この場合は 0) と比較したい場合、どうすればよいでしょうか? 私のアプローチの間違いは何ですか?

編集:私は試しました:

 bool operator==(const Player& lhs, int rhs) const {
    //...
 }

しかし、コンパイラは、関数のパラメーターが多すぎると言います。どうしてこれなの?== は 2 つ取ることができませんか?

ありがとう!

4

2 に答える 2

4

等値演算子をオーバーロードする方法は 2 つあります。1 つの引数 (rhs) を取るメンバーとして宣言します。または、2 つの引数 (lhs と rhs) を取ってグローバルとして宣言します。あなたの lhs は でPlayerあり、 yourrhsは整数であるため、定義する方法は 2 つあります。

// declared inside Player class as a member
bool operator == (int rhs) const
{
    return mInitiative == rhs;
}

// can also be declared inside Player class, but is not a member due to friend keyword
friend bool operator == (Player const& lhs, int rhs)
{
    return lhs.mInitiative == rhs;
}

これは、そのような方法で演算子をオーバーロードするスタイルに関する考慮事項を脇に置いています。

于 2013-06-15T17:55:20.470 に答える
3

等価演算子 (つまり==) をオーバーロードしようとするときは、ターゲット インスタンスが本当に同じかどうかを常に考える必要があります。

あなたの場合、プレーヤーと整数の比較を提供すると、次のコードを読むときに混乱する可能性があると思います。ポインタがnullかどうかをチェックするように見えるので:

if(playerVec[i] == 0)

Player の == 演算子をオーバーロードして整数と比較するのではなく、get() 関数を提供することをお勧めします。これにより、Player と整数をより明確に比較できます。例えば:

if (playerVec[i].getPlayerID() == 0)

Player ベクトルを管理するために何らかの stl 関数を使用する場合 (例: 並べ替え)、 2 つの Player インスタンスに対して==or>演算子をオーバーロードできます。

于 2013-06-15T18:00:30.133 に答える