class Animal
{
};
class Herbivore:Animal
{
void eat();
};
class Carnivore:Animal
{
void eat();
};
class Food
{
bool bMeat;
bool bVegeable;
};
我开始上课,突然之间,我不知道该怎么做食物,因为我想打印出每种“种类”的动物最喜欢的正确食物类型。
抱歉,我的食物类别很小但是我不能删除它,因为我的整个程序要求它区分食物类型。如果你提出不同的解决方案,我不介意。
答案 0 :(得分:1)
由于这是家庭作业,我不打算发布代码片段,我只是尝试解释(并且通过树,我认为你的意思是继承)。
我看到你已经修复了那些不是从Animal
继承的动物。但是,要将Food
合并到组合中,您可能希望拥有Animal
的成员(因此Animal
的每个子类必须拥有它),这是Food
favouriteFood
或类似的东西,在Animal
的每个子类的构造函数中初始化为该动物最喜欢的食物。
我认为你要做的第二件事是使成员函数eat
成为virtual
和Animal
的一部分,以便Animal
的每个子类都有该成员(以及虚拟成员,当您通过Animal*
或&
调用该函数时,它将调用正确的版本)。然后让eat
有一个参数,即Food
,即他们正在吃的食物。
答案 1 :(得分:0)
尝试bool eat(Food & food)
之类的内容。在eat
中,您可以检查您的动物是否喜欢它并返回false
或消耗食物并返回true
。抛出bad_food
异常而不是返回值也是有意义的。
答案 2 :(得分:0)
以下是我要尝试的内容:
class Food;
class Vegetable : Food { ; };
class Meat : Food { ; }
struct Animal
{
virtual void eat(const Food& f)
{;} // Stubbed.
};
struct Herbivore : Animal
{
virtual void eat(const Vegetable&) = 0;
};
struct Carnivore : Animal
{
virtual void eat(const Meat&) = 0;
};
struct Omnivore : Animal
{
void eat(const Food& f)
{ cout << "I'm not picky.\n"; }
};
我建议您查找 double dispatch 和访问者设计模式等概念。