私はC++でエコシステムを開発している初心者です。C++エコシステムシミュレータ(継承)
PLANTS
(ここには表示されません)とANIMALS
はグリッドにあります。
ANIMAL
の場合は、CARNIVORE
またはHERBIVORE
のいずれかです。
私はこの階層を作成しました:
class ANIMAL
{
private:
int a_CUR_food_lvl;
const int a_MAX_food_lvl;
const int a_hunger_rate;
public:
ANIMAL(int curr, int max, int rate)
: a_CUR_food_lvl(curr),
a_MAX_food_lvl(max),
a_hunger_rate(rate)
{}
virtual ~ANIMAL()
{
delete this;
}
virtual void Move() = 0;
virtual void Eat() = 0;
virtual void Evade() = 0;
virtual void Reproduce() = 0;
virtual void Die() = 0;
virtual void Age() = 0;
virtual int get_a_CUR_food_lvl() { return a_CUR_food_lvl; };
virtual int get_a_MAX_food_lvl() { return a_MAX_food_lvl; };
virtual int get_a_hunger_rate() { return a_hunger_rate; };
}; //end ANIMAL class
//#################################################################
class CARNIVORE : public ANIMAL
{
public:
class WOLF : public ANIMAL
{
WOLF()
: ANIMAL(150, 200, 2)
{}
};
class CHEETAH : public ANIMAL
{
CHEETAH()
: ANIMAL(75, 125, 5)
{}
};
}; //end CARNIVORE class
//#################################################################
class HERBIVORE : public ANIMAL
{
public:
class RABBIT : public ANIMAL
{
RABBIT()
: ANIMAL(150, 200, 2)
{}
};
class SQUIRREL : public ANIMAL
{
SQUIRREL()
: ANIMAL(150, 200, 2)
{}
};
}; //end HERBIVORE class
私の問題:その後ラインダウン
を、私は1匹の動物が他の動物を食べることを許可されているかどうかを確認するためにdynamic_castを使用したいです。具体的には、Animal
A
は、A
がCARNIVORE
であり、B
であり、HERBIVORE
である場合にのみ、動物B
を食べることが許される。
私はプログラミングの後半でオブジェクトのタイプをチェックできるようにクラスをネストしますか?私はこれが今正しいと思うことは望まないでしょうし、それをラインの下で変えなければなりません。
dynamic_cast
(ブール値is_carnivore
?)以外の方法が良い場合は、代わりにそれを使用する必要がありますか?私は最も読みやすく、最高のOOPの練習を目指しています
なぜクラスをネストしたいのですか?なぜ、他のレベルの継承だけではないのですか? (そして、大文字でクラス名を書かないでください...) – Chiel
ANIMALには仮想デストラクタが必要です。 –
これは私のジレンマです。だから私はネストが間違ったアプローチだと仮定していますか?別のレベルの継承をどのように使用しますか? (okay) – user3487243