一类动物性食物选择问题的设计

时间:2011-08-18 17:45:15

标签: c++

class Animal
{

};

class Herbivore:Animal
{
   void eat();
};

class Carnivore:Animal
{  
   void eat();
};

class Food
{
   bool bMeat;
   bool bVegeable;
};

我开始上课,突然之间,我不知道该怎么做食物,因为我想打印出每种“种类”的动物最喜欢的正确食物类型。

抱歉,我的食物类别很小但是我不能删除它,因为我的整个程序要求它区分食物类型。如果你提出不同的解决方案,我不介意。

3 个答案:

答案 0 :(得分:1)

由于这是家庭作业,我不打算发布代码片段,我只是尝试解释(并且通过树,我认为你的意思是继承)。

我看到你已经修复了那些不是从Animal继承的动物。但是,要将Food合并到组合中,您可能希望拥有Animal的成员(因此Animal的每个子类必须拥有它),这是Food favouriteFood或类似的东西,在Animal的每个子类的构造函数中初始化为该动物最喜欢的食物。

我认为你要做的第二件事是使成员函数eat成为virtualAnimal的一部分,以便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 访问者设计模式等概念。