0

-最初に背景を説明しましょう-私の任務は、与えられたセナリオを取ることです(私の犬の相棒は裏庭でカエルを見て、空腹の場合はそれを食べます、そうでない場合はそれで遊ぶでしょう、彼がすでに2つ食べている場合は猫やリスを見ると吠え、別の犬が追いかけ、コヨーテが助けを求めて泣くなら、他の動物はそれを見るでしょう)。次に、特定の夜の動物の数をカウントし、その動物に対するバディの反応とともに別のファイルに記録します。人は記録されたファイルに日付を入力し、その日付の動物と相互作用を引き上げることができるようにする必要があります。-

これが私が現在持っているコードです:

#include <iostream>
#include <cstdlib>
#include <ctime>

using namespace std;

class animal{
public:
   animal();
   ~animal();
   virtual string interactWithBuddy()//all derived classes use this
   {
        return "Buddy ";
   } 

};
animal::animal()
{
}
class frog: public animal
{

 public:
         string interactWithBuddy()
         {
              return "Buddy \n";
         }
         static int ID()
         {
             return 1;//ID assigned to frog for randomization purposes
         }         
};
class dog: public animal
{                
   public:
         string interactWithBuddy()
         {
              return "Buddy chased the dog\n";
         }
         static int ID()
         {
             return 2;//ID assigned to dog for randomization purposes
         }

};
class cat: public animal
{
  public:
         string interactWithBuddy()
         {
              return "Buddy barked at the cat \n";
         }
         static int ID()
         {
             return 3;//ID assigned to cat for randomization purposes
         }
};
class coyote: public animal
{
  public:
         string interactWithBuddy()
         {
              return "Buddy cried for help when he seen the coyote \n";
         }
         static int ID()
         {
             return 4;//ID assigned to coyote for randomization purposes
         }
};
class squirrel: public animal
{
  public:
         string interactWithBuddy()
         {
                return "Buddy barked at the squirrel \n";
         } 
         static int ID()
         {
             return 5;//ID assigned to squirrel for randomization purposes
         }
};
class otherAnimal: public animal
{
  public:
         string interactWithBuddy()
         {
                return "Buddy watched the animal \n";
         } 
         static int ID()
         {
             return 6; //ID assigned to otherAnimal for randomization purposes
         }
};
int main ()
{
srand(time(0)); //intializes the random seed
int number;
animal * a; // pointer to animal 
  std::cout << (rand() % 6 + 1) <<std::endl;  //return random number between 1-6

 // loop to assign the random number output a proper animal ID
  if (number == frog::ID()) 
  {
        a = new frog;
        a->interactWithBuddy();

  }
  else if (number == dog::ID())
  {
       a = new dog;
       a->interactWithBuddy();
  }
  else if (number == cat::ID())
  {
       a = new cat;
       a->interactWithBuddy();
  }
  else if (number == coyote::ID())
  {
       a = new coyote;
       a->interactWithBuddy();
  }
  else if (number == squirrel::ID())
  {
     a = new squirrel;
     a->interactWithBuddy();
  }
  else if (number == otherAnimal::ID()) 
  {
      a = new otherAnimal;
      a->interactWithBuddy();
  }

return 0;
}

エラーなしでコンパイルしますが、出力をコードチェックすると、「100行目:警告:「数値」はこの関数で初期化されていない状態で使用されています」というエラーが表示されます。

4

4 に答える 4

3
virtual int ID() //allows declared value in subclass
{
        return ("My ID number is\n");
}

int関数が整数を返すことを意味します。ただし、実際には文字列(const char *)を返します。コンパイラーは、あなたがconst char *返したものintをあなたが返すはずだったものに変換する方法を知りません。

于 2012-08-27T02:02:47.137 に答える
1

2番目の質問については、関数からcstringを返していますが、関数の戻り型を整数として宣言しています。二重引用符""の間にあるものはすべて、定数文字列と見なされます。関数の戻り値の型を変更するか、整数を返します

于 2012-08-27T02:03:31.243 に答える
0

最初の質問では、これには数回の試行が必要になる場合があります。

まず、動物をランダムに選択したいとします。

srand(time(0)); //initializes the random seed
int number = rand() % 6 + 1;
animal *a;
if(number == 1)
{
  a = new frog;
}
if(number == 2)
{
  a = new dog;
}
...

a->interactWithBuddy();
delete(a); // Don't forget to delete what you create with "new".

それは機能しますが、ID番号はここでは「ハードコーディング」されており、作成したID()関数は使用されません。を使用したい場合はID()、各動物を1つずつ持って、どれが一致するかを確認できますnumber

frog Kermit;
dog Ralph;
cat Felix;
coyote Loki;
squirrel Sparticus;

if(number == kermit.ID())
{
  kermit.interactWithBuddy();
}
if(number == Ralph.ID())
{
  Ralph.interactWithBuddy();
}
...

ID()動物が存在するまで動物に頼むことができないので、事前に各動物を持っている必要があります。ただし、「 」を使用して、動物のIDを取得する前に、そのタイプの動物のIDを要求できるID()ようにコーディングする方法があります。static

class animal{
public:
  animal();
  ~animal();
  void interactWithBuddy();
};

class frog: public animal
{
public:
  ...
  static int ID()
  {
    return 1;
  }
};

...

int main()
{
  ...
  if(number == frog::ID())
  {
    a = new frog;
  }
  ...
}

これにより、で問題が発生しなくなったため、2番目の問題も解決OD()されますanimal

それで十分ですか?他の可能性があります。

編集:

あなたは忘れint number = rand() % 6 + 1;ました。

于 2012-08-27T03:21:57.947 に答える
0

関数は整数を返すように宣言されています-nullで終了する文字列を返します

代わりに、基本クラスで次のようなエラータイプIDを返す可能性があります

 virtual int ID()
 {
     return -1;
 }
于 2012-08-27T02:07:35.803 に答える