0

我的任务是

“我的狗,名叫巴迪,住在后院。晚上看到猫或松鼠来拜访时,它会吠叫。如果它看到青蛙,并且饿了,它就会吃掉它。如果它看到青蛙他不饿,他就和它玩。如果他已经吃了 2 只青蛙,但仍然饿,他会放手。如果他看到一只土狼,他会大声呼救。有时他的朋友 Spot 路过,然后他们互相追逐。如果他看到任何其他动物,他只是看着它。

编写一个测试程序和一组类来跟踪所有后院活动并将结果存储到给定夜晚的文件中。我希望你会有一个动物类,以及一个继承自动物类的猫、狗、松鼠、郊狼类。你需要记录他吃了多少只青蛙,每种类型的动物有多少来访,他玩的频率以及其他类似细节。"

您还需要编写一个测试程序,该程序将读取从其他测试程序生成的文件,并打印出他见过的每种动物的数量,以及他在特定的一天对它们做了什么。用户需要输入日期,该日期的文件信息将被读入并显示。

将任何其他功能添加到您需要的程序中,使其涵盖列出的所有必需的编程概念。创造性地完成这项任务。

-我们将使用类、数据抽象、继承、组合、指针、运算符重载和异常处理。-

#include <iostream>
#include <cstdlib>

using namespace std;

class animal{
public:
       animal();
       ~animal();
       void interactWithBuddy(); 
       virtual int ID()
        {
          return ID;
        }
 };
class frog: public animal
{
     public:
            void interactWithBuddy();
            void eat();
            void play();
            void letGo();

};
class dog: public animal
{      
       public:
              void interactWithBuddy();
              void chase();

};
class cat: public animal
{
      public:
             void interactWithBuddy();
             void bark();
};
class coyote: public animal
{
      public:
             void interactWithBuddy();
             void cryForHelp();
};
class squirrel: public animal
{
      public:
             void interactWithBuddy();
             void bark();
};
class otherAnimal: public animal
{
      public:
             void interactWithBuddy();
             void watch();
};
int main ()
{
    srand(time(0)); 
    int number; 
      std::cout << (rand() % 6 + 1) <<std::endl;   
    animal * a = new frog(); 
        int z = a->ID(); 
    animal * b = new dog();
         int y = a->ID();
    animal * c = new cat();
         int x = a->ID();
    animal * d = new coyote();
         int w = a->ID();
    animal * e = new squirrel();
         int v = a->ID();
    animal * f = new otherAnimal();
         int u = a->ID();         
    return 0;
}

我知道代码只是一个外壳,但我在正确的轨道上吗?你如何建议数青蛙并计算它们是否被吃掉、被玩弄或放手?此外,我想为每个动物子类分配一个数字,然后我可以在主函数中随机化以与分配相关,但我不确定如何完成。非常欢迎提示和指示。

4

2 回答 2

2

您在基类中投入了太多。并非所有动物都能做其他动物能做的所有事情。你的animal课程应该只包含任何动物可以拥有/做的东西。所有特定于具体动物(即狗或青蛙)的东西都应该放在相应的类中。例如,不是每个动物都可以bark(),当然,所以这个函数不应该在基类中。

你如何建议数青蛙并计算它们是否被吃掉、被玩弄或放手?

好吧,既然是能看到青蛙的狗,那么在课堂上放一个计数器是有道理的dog

此外,我想为每个动物子类分配一个数字,然后我可以在主函数中随机化以与分配相关,但我不确定如何完成。

我不太明白你在这里是什么意思。您的意思是要为每个班级制作标识符吗?如果是,您为什么需要这样做?

升级版:

是的,这是一个正确的方法。最简单的方法是为每只动物分配从 1 到 6 的数字,然后当需要确定出现哪一个时,生成一个 范围内的随机数[1,6]。要为动物分配编号,您应该int id;在每个类中添加一个类似的字段并为其分配不同的值。

UDP 2:

这就是多态性发挥作用的地方。首先,要为一个类初始化一个 const 成员,您需要将其设为静态。这是一个简单的例子:

class base
{
public:
    static const int ID = -1;
};

class derived: public base
{
public:
    static const int ID = 1;
};

现在基类的每个对象的 ID 为 -1,派生类的每个对象的 ID 为 1。但是,如果您尝试从这样的基类指针中使用它:

base * a = new derived();
int t = a->ID;

你总是会得到-1,因为基类指针不知道它指向什么。要获得正确的 ID,您需要创建一个虚函数:

virtual int getId(){ return ID; }

现在,如果你愿意

base * a = new derived();
int t = a->getID();

您将始终从“真实”类型a点处获得正确的 ID。

于 2012-08-24T06:32:13.323 回答
1

我建议您将随机逻辑放在工具之外……关注点分离。然后你可以让一个程序从标准输入中读取一系列动物名称,执行操作并记录它需要的任何内容,然后当它检测到文件结束时打印一个摘要报告。您可以简单地测试它,如下所示:

echo cat frog frog squirrel frog | buddy_simulator

如果你愿意,你可以创建一个程序来随机化一些输入。

基本逻辑应该是:

std::string animal_name;
while (std::cin >> animal_name)
{
    // do something animal_specific
}
// do reporting

animal_name可以使用接受参数并将适当的返回Animal*到新堆分配的动物对象的工厂方法来创建特定于动物的行为。然后,您可以调用p->suffer_buddy();,这将更新静态成员“看到此动物的次数”计数器,打印出好友喜欢做什么(在此目击时)。如果这是第一次看到该动物,您可以将指针存储到vectorin 中main(),这样当您想要进行汇总报告时,您可以调用p->report()您遇到的每种动物类型。 Frog::report(),例如,可能类似于:

void Frog::report()
{
    std::cout << "of " << count_ << " frogs, " << eaten_ << " eaten, " << played_with_ << " played with, " << let_go_ << " let go\n";
}

使用这么多静态变量有点难看,但让它像这样工作更容易。

(不幸的是,这种行为没有明确规定——你如何确定好友是否饿了?根本没有规定,所以你必须做出一些假设(并记录下来)或让你的老师指定这一点。)

这一切都非常愚蠢,但是使用多态层次结构建模这个问题也是如此,所以你去......

于 2012-08-24T07:17:00.043 回答