首页 > 分享 > C++ 安妮的宠物小屋 练习

C++ 安妮的宠物小屋 练习

题目:安妮的宠物小屋里买若干个笼子  可以装不同的动物  安妮与动物玩   安妮在屋子中看见动物

首先  我们要画出类图

猫狗蛇三类继承了Animal ;

动物,笼子,房子类依赖于Anne类   

笼子类  Cage与房子类House的关系是聚合

笼子类与动物类的关系是关联

 其中 我们定义了一个抽像类Animal

类中包含

public:
    string  strName;
    string  strColor;

动物的颜色和名字

又包含了以下几个成员函数

public:
    Animal();    构造
    ~Animal();  析构
    virtual void Play()=0;   纯虚函数  动物的玩的方式
    virtual void Say()=0;   纯虚函数   叫声
    void Show();                显示动物信息
    void Init(string  strName, string  strColor);     添加动物

首先  对Animal 进行声明

#pragma once

#include<iostream>

#include<string>

using namespace std;

class Animal

{

public:

string strName;

string strColor;

public:

Animal();

~Animal();

virtual void Play()=0;

virtual void Say()=0;

void Show();

void Init(string strName, string strColor);

};

然后进行实现

这里我们启用了模板模式   在Show函数中 不同动物的不同叫声 是一种多态  我们用虚函数Say

来实现

把动物共有的几个属性写在Show函数中     不同的属性用Say()

#include "Animal.h"

Animal::Animal()

{

strName="";

strColor="";

}

Animal::~Animal()

{

}

void Animal::Show()

{

cout << strName << endl;

cout << strColor << endl;

Say();

}

void Animal::Init(string Name, string Color)

{

strName = Name;

strColor = Color;

}

然后我们列出几个动物类来继承Animal

我们这列举出 猫  狗  蛇三中动物

#pragma once

#include "Animal.h"

class Cat :

public Animal

{

public:

virtual void Play();

virtual void Say();

};

#pragma once

#include "Animal.h"

class Dog :

public Animal

{

public:

virtual void Play();

virtual void Say();

};

#pragma once

#include "Animal.h"

class Snack :

public Animal

{

public:

virtual void Play();

virtual void Say();

};

他们都继承了Animal的成员  与方法  我们只需对纯虚函数Play()和Say()重写即可

下买我们对这些动物进行实现

#include "Cat.h"

void Cat::Play()

{

cout << "猫玩" << endl;

}

void Cat::Say()

{

cout << "猫叫" << endl;

}

#include "Dog.h"

void Dog::Play()

{

cout << "狗玩" << endl;

}

void Dog::Say()

{

cout << "狗叫" << endl;

}

#include "Snack.h"

void Snack::Play()

{

cout << "蛇玩" << endl;

}

void Snack::Say()

{

cout << "蛇叫" << endl;

}

之后我们开始对笼子类Cage进行声明与编写

它包含了笼子的编号nId;和动物指针  用来存动物

#pragma once

#include "Animal.h"

class Cage

{

public:

int nId;

Animal* pAnimal;

public:

Cage();

~Cage();

};

#include "Cage.h"

Cage::Cage()

{

nId=0;

pAnimal=NULL;

}

Cage::~Cage()

{

}

之后我们在对小屋类声明和实现

在小屋类中 我们有一个Cage*型的链表成员变量   用来聚合一堆笼子

用容器list来实现

#pragma once

#include "Cage.h"

#include<list>

using namespace std;

class House

{

public:

list<Cage*> lst;

public:

House();

~House();

};

#include "House.h"

House::House()

{

}

House::~House()

{

list<Cage*> ::iterator ite = lst.begin();

while (ite!= lst.end())

{

delete* ite;

ite++;

}

}

在析构函数中  我们对链表遍历删除  用到了list容器中的迭代器

最后 开始对我们的控制类(Anne)进行编写

#pragma once

#include "Animal.h"

#include "House.h"

class Anne

{

public:

void BuyCage(House& house, int nId);

void PushAnimale(House& hou, Animal* pAnimal);

void PopAnimal(House& hou, int nId);

void PlayWithAnimal(House& hou, int nId);

void See(House& hou);

};

可以看出  我们在Anne类中实现以下几种功能

添加笼子

把动物装进笼子

把动物从笼子中放出来

和动物玩

显示动物

首先 我们对添加笼子函数实现

这里笼子编号我们用list容器中的函数size+1标记

void Anne::BuyCage(House& house, int ncount)

{

for (int i=0; i < ncount; i++)

{

Cage* cage = new Cage;

cage->nId = (int)house.lst.size() + 1;

house.lst.push_back(cage);

}

}

然后实现我们的放动物函数

同样利用迭代器遍历  找到空笼子 然后判断  赋值

void Anne::PushAnimale(House& hou, Animal* pAnimal)

{

list<Cage*> ::iterator ite = hou.lst.begin();

while (ite != hou.lst.end())

{

if ((*ite)->pAnimal == NULL)

{

(*ite)->pAnimal = pAnimal;

return;

}

ite++;

}

cout << "没有笼子了 去买一些吧" << endl;

}

开始对放出动物编写

void Anne::PopAnimal(House& hou, int nId)

{

list<Cage*> ::iterator ite = hou.lst.begin();

while (ite != hou.lst.end())

{

if ((*ite)->nId == nId)

{

if ((*ite)->pAnimal != NULL)

{

delete (*ite)->pAnimal;

}

(*ite)->pAnimal = NULL;

return;

}

else

{

cout << "编号为[" << nId << "]的笼子中没有动物" << endl;

}

ite++;

}

cout << "没有找到编号为[" << nId << "]的笼子" << endl;

}

和动物玩

void Anne::PlayWithAnimal(House& hou, int nId)

{

list<Cage*> ::iterator ite = hou.lst.begin();

while (ite != hou.lst.end())

{

if ((*ite)->nId == nId)

{

if ((*ite)->pAnimal != NULL)

{

(*ite)->pAnimal->Play();

cout << " 安妮和动物玩" << endl;

}

else

{

cout << "笼子里没动物 安妮自己玩" << endl;

}

return;

}

ite++;

}

cout << "没有找到编号为[" << nId << "]的笼子" << endl;

}

显示

void Anne::See(House& hou)

{

list<Cage*> ::iterator ite = hou.lst.begin();

while (ite != hou.lst.end())

{

if ((*ite)->pAnimal != NULL)

{

(*ite)->pAnimal->Show();

}

else

{

cout << "空笼子" << endl;

}

cout << "------" << endl;

ite++;

}

}

在主函数中

我们

cat->Init("小花", "花色");

Animal* dog = new Dog;

dog->Init("小黄", "黄色");

Animal* snack = new Snack;

snack->Init("小绿", "绿色");

Animal* cat1 = new Cat;

cat1->Init("小灰", "灰色");

House hou ;

Anne an ;

an.BuyCage(hou, 3);

an.PushAnimale(hou, cat);

an.PushAnimale(hou, dog);

an.See(hou);

an.PopAnimal(hou, 1);

an.See(hou);

an.PlayWithAnimal(hou, 2);

添加了三个笼子 

1号放小花  猫   

2号放小黄  狗

3号放小绿  蛇

然后显示屋子里的所有动物

然后放出一号笼子里的动物

在显示

然后和2号笼子里的动物玩

执行结果如下

相关知识

C++程序设计(上)练习
2.4节练习
C++课程作业之 宠物类的创建
急救假人安妮
C++动物运动会源代码资源
a=b++,c++和a=(b++,c++)的区别
安妮
C++中+= 是什么意思
C++第二天
洛克王国魔法乐园 安妮幻境捕捉宠物

网址: C++ 安妮的宠物小屋 练习 https://m.mcbbbk.com/newsview490185.html

所属分类:萌宠日常
上一篇: 宠物(猫咪)托运全流程讲解
下一篇: 宠物笼 宠物兔笼 厂家直销