- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我是一名使用 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
我的问题:
稍后,我想使用 dynamic_cast查看是否允许一只动物吃另一只动物。具体来说,如果 A
是 CARNIVORE
,Animal
A
只允许吃动物 B
> 和 B
一个 HERBIVORE
。
像我那样嵌套类是否允许我在以后的编程中检查对象的类型?我现在不想认为这是正确的并且不得不改变它。
或者如果有比 dynamic_cast
( bool 值 is_carnivore
?)更好的方法,我应该改用它吗?我的目标是最易读和最佳的 OOP 实践
最佳答案
您的嵌套类根本不代表您想要的。不要进一步考虑此构造来解决您的问题。相反:
然后有几种方法可以查看动物 *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/
我最近遇到了 HFOSS (人道主义免费开源软件)项目以及其他一些公司在做智能电网软件公司和其他类型的绿色软件项目。 由于我正在对该主题进行一些研究,并且因为谷歌在绿色/生态/人道主义/可持续性上的搜
我是一名优秀的程序员,十分优秀!