2

質問する前に:はい、これは大学の課題です。

割り当ては非常に簡単です。機能が追加されたホイストカードゲームを実装します。アシスタントは私たちに継承と「会う」ことを望んでおり(このコースを受講するのは2回目なので、それが何であるかを知っています)、カードクラスに次を使用するように指示しました。派生元の基本クラスのカードを作成します。彼らが持っているスーツ(ハート、ダイアモンド、...)に応じて4つの継承されたクラス。

ここで継承を使用するのはかなり奇妙だと思います(これらのクラスには.fSuitとにかくデータメンバーがあるため)。まだ見ていないvirtualので、ここでは使用しません。これはコーディングするのはそれほど難しいことではありませんが、私がこれに関して抱えている問題:operatorsカードを比較するために派生する必要がありますが、派生したクラスは互いに比較されない場合があります(コンパイラはアシスタントに従ってエラーをスローする必要があります)。私は最初に使用friend bool operator<(Card&, Card&)しましたが、フレンド関数は派生クラスに関連付けられておらず、派生クラスは基本クラスであるかのように処理されることを学びました。

コードを彼が望むように機能させるにはどうすればよいですか?演算子の使用をやめfriendてCardクラスの一部にすることはできますが、派生クラスを相互に比較することはできます。私は何かが足りないのですか?よろしくお願いします。

ps:ソリューションをコーディングするのがまったくクリーンでない場合は、比較する前に、Cardクラスの演算子部分のスーツをチェックする方がよいでしょう。

編集:彼はまた、1つの演算子def/declをすべての派生クラスに対して一度に機能させたいと考えていました。派生クラスごとにフレンド演算子を作成することも、考えられる解決策です。

4

4 に答える 4

2

operator<最も簡単な解決策は、基本クラスではなく派生クラスでのみ実装することだと思います(すべてのクラスはそれ自体とのみ比較でき、コンパイラーはダイモンドとハートなどを比較できません)

これはかなり愚かですが、おそらくあなたの質問に答えます、そしてそれはおそらくあなたがすべきことです。

于 2012-12-14T16:20:57.930 に答える
2

これが必要な場合

class Card {};
class Hearts : public Card {};
Hearts a,b;
a < b;

コンパイルしますが、これはしません

class Card {};
class Hearts : public Card {};
class Diamonds : public Card {};
Hearts a;
Diamonds b;
a < b;

次に、ジェネリックを提供するのではなく、各派生クラスのメンバーoperator<(Card&)のみを提供する必要があります。operator<

于 2012-12-14T16:22:16.213 に答える
1

ここでフレンド関数を使用できますが、2つの引数を取るように宣言する必要があります

class Card {
public:
    friend bool operator<(const Card &c1, const Card &c2);
    ...
};
于 2012-12-14T16:21:09.507 に答える
1

ゲームのルールを知っているなら、おそらくあなたのインストラクターがそれを求めている方法でクラスを構築することは理にかなっています。

このゲームでは、4人のプレイヤーのそれぞれが通常の52枚のカードデッキから13枚のカードを獲得します。その後、ゲームはトリックと呼ばれる13ラウンドでプレイされます。各ラウンドで、最後のラウンドの勝者がどのスーツをプレイするかを決定し、他の人はスーツをフォローするか、切り札(そのスーツはドナーの最後のカードから決定されます)、または他のカード(その後どんなスーツや切り札よりも弱い)。したがって、<オペレーターは、ゲームごとに(トランプはゲームごとに同じではないため)、およびラウンドごとに(スーツはラウンドごとに同じではないため)、これらのパラメーターに従って意味を変更します。

クラスインターフェイスはほぼ順調に見えます。比較演算子コードをどのように変更する必要があるかを理解してください。どういうわけか、あなたはゲームラウンドを追跡しなければなりません、そしてどのスーツが選ばれたものであるか、そしてどれが切り札であるか。これらのパラメータはおそらく祖先の一部である必要がありますが、各専門クラスは、それらが現在のラウンドの切り札または最初のカードの色と等しいかどうかをチェックします。

friendそのために関数を使う必要はないと思います。

理想的には、ゲームの仕組みはカード処理の部分から分離する必要がありますが、言語の継承の側面を研究するためのものであるため、この割り当てのコードにこれらを混在させることができると思います。

于 2012-12-14T17:48:36.783 に答える