题目:安妮的宠物小屋里买若干个笼子 可以装不同的动物 安妮与动物玩 安妮在屋子中看见动物
首先 我们要画出类图
猫狗蛇三类继承了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
上一篇: 宠物(猫咪)托运全流程讲解 |
下一篇: 宠物笼 宠物兔笼 厂家直销 |