0

私の課題は

「バディという名前の私の犬は裏庭に住んでいます。彼は夜に猫やリスが訪ねてくるのを見ると吠えます。カエルを見てお腹がすいたら食べます。カエルを見るとお腹がすいていないときは遊んでいる. すでに 2 匹のカエルを食べていて、まだお腹が空いている場合は、カエルを手放します. コヨーテを見ると、助けを求めて泣きます. 時々、友達のスポットが立ち寄って、彼らはお互いを追いかけます. 彼が他の動物を見たら、彼はただそれを見ます.

1 つのテスト プログラムと、裏庭でのすべてのアクティビティを追跡し、特定の夜の結果をファイルに保存する一連のクラスを作成します。動物クラスと、動物クラスを継承する猫、犬、リス、コヨーテのクラスがあると思います。彼が食べたカエルの数、各タイプの動物の数、訪れたカエルの数、彼が遊んだ頻度などの詳細を追跡する必要があります。"

また、他のテスト プログラムから生成されたファイルを読み取るテスト プログラムを作成し、彼が見た各タイプの動物の数、特定の日に何をしたかを出力する必要があります。ユーザーは日付を入力する必要があり、その日付のファイルからの情報が読み込まれ、表示されます。

必要なその他の機能をプログラムに追加して、リストされている必要なプログラミング概念をすべてカバーできるようにします。この割り当てで創造的になりましょう。

-クラス、データの抽象化、継承、合成、ポインター、演算子のオーバーロード、および例外処理を使用します。

#include <iostream>
#include <cstdlib>

using namespace std;

class animal{
public:
       animal();
       ~animal();
       void interactWithBuddy(); 
       virtual int ID()
        {
          return ID;
        }
 };
class frog: public animal
{
     public:
            void interactWithBuddy();
            void eat();
            void play();
            void letGo();

};
class dog: public animal
{      
       public:
              void interactWithBuddy();
              void chase();

};
class cat: public animal
{
      public:
             void interactWithBuddy();
             void bark();
};
class coyote: public animal
{
      public:
             void interactWithBuddy();
             void cryForHelp();
};
class squirrel: public animal
{
      public:
             void interactWithBuddy();
             void bark();
};
class otherAnimal: public animal
{
      public:
             void interactWithBuddy();
             void watch();
};
int main ()
{
    srand(time(0)); 
    int number; 
      std::cout << (rand() % 6 + 1) <<std::endl;   
    animal * a = new frog(); 
        int z = a->ID(); 
    animal * b = new dog();
         int y = a->ID();
    animal * c = new cat();
         int x = a->ID();
    animal * d = new coyote();
         int w = a->ID();
    animal * e = new squirrel();
         int v = a->ID();
    animal * f = new otherAnimal();
         int u = a->ID();         
    return 0;
}

コードが単なるシェルであることはわかっていますが、正しい方向に進んでいますか? カエルの数を数えて、食べるか、遊ぶか、手放すかを判断するにはどうすればよいでしょうか? また、各動物のサブクラスに番号を割り当て、メイン関数でランダム化して割り当てと相関させたいと考えていますが、それがどのように行われるかはわかりません。ヒントや指針は大歓迎です。

4

2 に答える 2

2

基本クラスに入れすぎています。すべての動物が他の動物と同じようにできるわけではありません。クラスには動物が持つ/できるanimalものだけを含める必要があります。具体的な動物 (つまり、犬やカエル) に固有のものはすべて、対応するクラスに配置する必要があります。たとえば、すべての動物が.bark()

カエルの数を数えて、食べるか、遊ぶか、手放すかを判断するにはどうすればよいでしょうか?

カエルが見えるのは犬なので、カウンターをdogクラスに入れるのは理にかなっています。

また、各動物のサブクラスに番号を割り当て、メイン関数でランダム化して割り当てと相関させたいと考えていますが、それがどのように行われるかはわかりません。

ここで言っている意味がよくわかりませんでした。クラスごとに識別子を作りたいということですか?はいの場合、なぜそれを行う必要がありますか?

更新:

はい、それは正しいアプローチです。最も簡単な方法は、各動物に 1 ~ 6 の数字を割り当て、どの動物が登場するかを判断する必要がある場合に、 の範囲で乱数を生成することです[1,6]。動物に番号を割り当てるには、次のようなフィールドを追加しint id;、各クラスで異なる値を割り当てる必要があります。

UDP 2:

ここでポリモーフィズムの出番です。まず、クラスの const メンバーを初期化するには、静的にする必要があります。簡単な例を次に示します。

class base
{
public:
    static const int ID = -1;
};

class derived: public base
{
public:
    static const int ID = 1;
};

これで、基本クラスのすべてのオブジェクトの ID が -1 になり、派生クラスのすべてのオブジェクトの ID が 1 になります。ただし、次のように基本クラス ポインターから使用しようとすると:

base * a = new derived();
int t = a->ID;

基本クラスのポインターはそれが何を指しているのかわからないため、常に-1を取得します。正しい ID を取得するには、仮想関数を作成する必要があります。

virtual int getId(){ return ID; }

今あなたがするなら

base * a = new derived();
int t = a->getID();

「実際の」タイプのポイントから常に正しいIDを取得します。a

于 2012-08-24T06:32:13.323 に答える
1

ランダムロジックをツールの外に置くことをお勧めします...懸念の分離。次に、標準入力から一連の動物名を読み取り、アクションを実行して必要なものを記録し、ファイルの終わりを検出すると要約レポートを出力する 1 つのプログラムを作成できます。次のように簡単にテストできます。

echo cat frog frog squirrel frog | buddy_simulator

必要に応じて、入力をランダム化するプログラムを作成できます。

基本的なロジックは次のとおりです。

std::string animal_name;
while (std::cin >> animal_name)
{
    // do something animal_specific
}
// do reporting

動物固有の動作は、ファクトリ メソッドを使用してパラメーターを受け取り、新しくヒープに割り当てられた動物オブジェクトにanimal_name適切な値を返すことで作成できます。Animal*次に、 を呼び出しp->suffer_buddy();て、静的メンバーの「この動物が見られた回数」カウンターを更新し、相棒が (この目撃情報で) 何をするのが好きかを出力できます。その動物が初めて見られた場合は、ポインターをvectorinに格納して、要約レポートを作成するときに、遭遇した動物の種類ごとに main()呼び出すことができます。たとえば、次のようになります。p->report()Frog::report()

void Frog::report()
{
    std::cout << "of " << count_ << " frogs, " << eaten_ << " eaten, " << played_with_ << " played with, " << let_go_ << " let go\n";
}

あまりにも多くの静的変数を使用するのは少し見苦しいですが、このように機能させる方が簡単です。

(残念なことに、行動は明確に規定されていません。相棒がお腹を空かせているかどうかをどのように判断しますか? それはまったく規定されていないため、いくつかの仮定を作成 (および文書化) するか、教師にこれを特定するよう依頼する必要があります。)

これはすべてかなりばかげていますが、ポリモーフィック階層を使用してこの問題をモデル化することも同様です。

于 2012-08-24T07:17:00.043 に答える