3

私には3つの(C ++)クラスがあります:Player、Hand、Cardです。

プレーヤーには、手を握るメンバー、手があります。また、手の内容を返すgetHand()メソッドもあります。

Hand Player::getHand() {
    return hand;
}

手には、手にカードを追加するメソッドaddCard(Card c)があります。

私はこれをしたい:

player1.getHand()。addCard(c);

しかし、それは機能しません。エラーをスローしないので、何かをしています。しかし、後でplayer1の手の内容を調べてみると、カードは追加されていません。

どうすればこれを機能させることができますか?

4

8 に答える 8

2

getHand()が値による値を返す場合は、元の手のコピーではなく、手のコピーを変更しています。

于 2008-09-22T03:27:41.320 に答える
1

getHand()が参照を返さない場合は、問題が発生します。

于 2008-09-22T03:28:30.693 に答える
1

Player.addCardToHand() メソッドは、他の方法で Hand を公開する理由がなければ、不合理ではありません。これはおそらくいくつかの点で理想的です。ハンドのコピーを提供して勝敗を比較することができ、誰もそれらを変更できないからです。

于 2008-09-22T03:37:08.053 に答える
1

メソッドは、プレーヤーの Hand オブジェクトへのポインターまたは参照を返す必要があります。「player1.getHand()->addCard(c)」のように呼び出すことができます。これは、ポインターである場合に使用する構文であることに注意してください。

于 2008-09-22T03:39:34.833 に答える
1

ハンド オブジェクトへの参照を返します。

Hand &Player::getHand() {
    return hand;
}

これで addCard() 関数は正しいオブジェクトで動作しています。

于 2008-09-22T03:42:05.577 に答える
0

getHand()の宣言は何ですか?新しいHand値を返しますか、それともHand&参照を返しますか?

于 2008-09-22T03:28:28.103 に答える
0

すでに述べたように、おそらくオリジナルではなくコピーを変更しているでしょう。

この種の間違いを防ぐために、コピーコンストラクターとequals演算子をプライベートとして明示的に宣言できます。

  private:
    Hand(const Hand& rhs);
    Hand& operator=(const Hand& rhs);
于 2008-09-22T03:33:50.617 に答える
0

getX() は、多くの場合、メンバー x のアクセサー関数の名前であり、独自の使用法と同様です。ただし、「getX」アクセサーは読み取り専用関数であることが非常に多いため、コード ベースの他の状況では、X を変更する「getX」の呼び出しを目にすると驚くかもしれません。

したがって、参照を戻り値として使用するのではなく、実際にコード設計を少し変更することをお勧めします。いくつかの代替案:

  • ポインター (または参照) を返す getMutableHand メソッドを公開します。ポインターを返すことにより、呼び出し元がポインター表記を使用することを強くお勧めします。これにより、コードを読んでいる人は、この変数が値を変更していて、読み取り専用ではないことがわかります。
  • Playerを Hand のサブクラスにして、 Hand を操作するものはすべて Player でも直接動作するようにします。直感的には、プレーヤーはハンドではないと言えますが、機能的には適切な関係があります。すべてのプレーヤーには正確に 1 つのハンドがあり、プレーヤーを介してハンドに同じようにアクセスできるようにしたいと考えているようです。直接でしょう。
  • Player クラスのaddCardメソッドを直接実装します。
于 2008-09-22T04:02:12.937 に答える