-1

このゾンビ/人間エージェント ベースのシミュレーションを実行しようとしていますが、親クラス「Creature」を持つこれらの派生クラス (人間とゾンビ) に問題があります。「Creature」で宣言された 3 つの仮想関数があり、これら 3 つすべてが「Human」と「Zombie」の両方で再宣言および定義されています。しかし、何らかの理由で、Human または Zombie 型のオブジェクトにメモリを割り当てるためにプログラムを "new" と呼ぶと、仮想関数が抽象的であるというエラーが表示されます。コードは次のとおりです。

ヘッダ:

class Creature
{          
public:
      virtual void Attack(Grid G) =0;
      virtual void AttackCreature(Grid G, int attackdirection) =0;
      virtual void Breed(Grid G) =0;
      virtual ~Creature() {}          
      void Die();
      void Move(Grid G);
      int DecideSquare(Grid G);
      void MoveTo(Grid G, int dir);           
};

class Human : public Creature 
{
public:          
      void Attack(Grid G);
      void AttackCreature(Grid G, int attackdirection);
      void Breed(Grid G); //will breed after x steps and next to human          
      int DecideAttack(Grid G);
};

class Zombie : public Creature
{
   public:
      void Attack(Grid G); 
      void AttackCreature(Grid G, int attackdirection);
      void Breed(Grid G) {} //does nothing  
      int DecideAttack(Grid G);
};

cpp:

void Creature::Move(Grid G) {...}
int Creature::DecideSquare(Grid G) {...}
void Creature::MoveTo(Grid G, int dir) {...}
void Creature::Die() {...}
void Human::Breed(Grid G) {...}   
int Human::DecideAttack(Grid G) {...}
void Human::AttackCreature(Grid G, int attackdirection) {...}
int Zombie::DecideAttack(Grid G) {...}
void Zombie::AttackCreature(Grid G, int attackdirection) {...}
void Zombie::Attack(Grid G) {...}
4

2 に答える 2

3

Creature

virtual void Breed() =0;

Human:

void Breed(Grid G);

これらは異なる機能です。後者は前者をオーバーライドしません。純粋仮想関数がCreature適切なパラメーターを取るようにします。

についても同様ですAttack()

于 2012-11-24T23:05:13.650 に答える
0

宣言された純粋仮想関数virtual void Creature::Attack(Grid G)がありましたが、派生クラスの実装はありませんでしたHuman。つまり、void Human::Attack(Grid G)メソッドが定義されていなかったため、vtableエラーが発生していました。約束した関数のソースコードが見つかりませんでした。悪い私!

于 2012-11-26T19:11:38.890 に答える