gpt4 book ai didi

C++生态系统模拟器(继承)

转载 作者:太空狗 更新时间:2023-10-29 23:39:22 25 4
gpt4 key购买 nike

我是一名使用 C++ 开发生态系统的初学者。它是这样工作的:

我的网格上有PLANTS(此处未显示)和ANIMALS

如果某物是ANIMAL,则它是CARNIVOREHERBIVORE

我创建了这个层次结构:

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

我的问题:

稍后,我想使用 dynamic_cast查看是否允许一只动物吃另一只动物。具体来说,如果 ACARNIVOREAnimal A 只允许吃动物 B > 和 B 一个 HERBIVORE

像我那样嵌套类是否允许我在以后的编程中检查对象的类型?我现在不想认为这是正确的并且不得不改变它。

或者如果有比 dynamic_cast( bool 值 is_carnivore?)更好的方法,我应该改用它吗?我的目标是最易读和最佳的 OOP 实践

最佳答案

您的嵌套类根本不代表您想要的。不要进一步考虑此构造来解决您的问题。相反:

  • WOLF和CHEETAH应该继承自CARNIVORE
  • SQUIRREL 和 RABBIT 应该继承 HERBIVORE

然后有几种方法可以查看动物 *a 是否可以吃动物 *b 另一个。正如您所建议的,最简单的方法是 dynamic_cast :

ANIMAL *a, *b; 
...
if (dynamic_cast<CARNIVORE*>(a) && dynamic_cast<HERBIVORE*>(b)) {
// *a can eat *b
}

但这不是最佳的 OOP 实践。我不知道你所有的限制和要求,但如果你想成为最先进的并且能够编码更复杂的规则(比如主角的力量和健康,某些物种的异常(exception)等)你可能是有兴趣实现某种 double dispatch (如讨论 here

关于C++生态系统模拟器(继承),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36584021/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com