C++:结合容器多态继承的(宠物小屋)实例

目录

一、题目要求:

二、自我理解题意

三、类视图详解

 四、代码

1.主函数

2.头文件

3.源文件

五、总结

一、题目要求

Anne的宠物小屋有若干个笼子,每个笼子可以放不同的动物,但只能放1只或0只,包括:猫Cat、狗Dog、蛇Snake要求:
1)实现一个简单的管理系统。包括空笼子),买一些笼子,带着动物出去玩。

二、自我理解题意

动物类(Cat)、(Dog)、(Snake)。(每个动物各是一个类)

包含名字  颜色。

笼子类:Cage负责装动物,每个笼子的编号不能相同,一个笼子只装一个动物,与动物类为关联关系。

包含Animal* pAnimal

房子类:负责存放装动物的笼子。

包含了链表容器。

人类:Anne 相当于控制类  (在这里我们没有做单例模式),负责花钱买动物,造笼子,将动物放在笼子中,存放到房子里,杀死某个笼子动物,销毁某个笼子(如果有动物一并销毁),查看某个或所有笼子动物,和某个动物玩耍。

三、类视图详解

 四、代码

1.主函数

#include "Cat.h"
#include "Dog.h"
#include "Snake.h"
#include "House.h"
#include "Anne.h"
#include "Anne.h"

int main()
{

	Cat c;
	c.Init("小猫", "黄色", "母");
	c.Show();
	c.Play();

	//Dog* d = new Dog;
	//d->Init("小狗", "黑色", "公");
	//d->Show();
	//d->Play();


	///*Snake s;
	//s.Init("小蛇", "白色", "公");
	//s.Show();
	//s.Play();*/

	//Cage* pCage = new Cage;
	//pCage->pAnimal = d;
	//House house;
	//house.lstcage.push_back(pCage);

	Cat* pCat = new Cat;
	pCat->Init("小白", "白色", "母");

	Dog* pDog = new Dog;
	pDog->Init("小黑","黑色","公");

	Snake* pSnake = new Snake;
	pSnake->Init("小青","绿色","母");

	House house;

	Anne anne;
	anne.BuyCage(house, 5);
	/*anne.See(house);*/


	anne.PushAnimal(house, 1, pCat);
	anne.PushAnimal(house, 2, pDog);
	anne.PushAnimal(house, 4, pSnake);

	anne.PopAnimal(house, 1);

	anne.See(house);
	anne.PopAnimal(house, 1);

	anne.PlayWithAnimal(house, 1);
	anne.PlayWithAnimal(house, 4);
	anne.PlayWithAnimal(house, 11);
	return 0;
}

2.头文件

#pragma once
#include <iostream>
#include <string>
using namespace std;


class Animal
{
private:
	string strName;
	string strColor;
	string strSex;
public:
	Animal();
public:
	virtual void Play() = 0;
	void Init(string strName, string strColor, string strSex);
	void Show();
};
#pragma once
#include "House.h"
class Anne
{
public:
	void BuyCage(House& house, int nCount);
	void PushAnimal(House& house, int nId, Animal* pAnimal);
	void PopAnimal(House& house, int nId);
	void See(House& house);
	void PlayWithAnimal(House& house, int nId);
};

#pragma once
#include "Animal.h"
class Cage
{
public:
	Animal* pAnimal;
	int Id;
public:
	Cage();
	virtual ~Cage();
};

#pragma once
#include "Animal.h"
class Cat :
    public Animal
{
public:
    virtual void Play();
};

#pragma once
#include "Animal.h"
class Dog :
    public Animal
{
public:
    virtual void Play();
};

#pragma once
#include "Cage.h"
#include <list>

class House
{
public:
	list<Cage*>lstcage;
public:
	virtual ~House();
};

#pragma once
#include "Animal.h"
class Snake :
    public Animal
{
public:
    virtual void Play();
};

3.源文件

#include "Animal.h"


Animal::Animal()
{
	strName = "";
	strColor = "";
	strSex = "";
}

void Animal::Init(string strName, string strColor, string strSex)
{
	this->strName = strName;
	this->strColor = strColor;
	this->strSex = strSex;
}
void Animal::Show()
{
	cout << strName << "  " << strColor << "  " << strSex << "  " << endl;
}
#include "Anne.h"
#include "House.h"

void Anne::BuyCage(House& house, int nCount)
{
	
	for (int i = 0; i < nCount; i++)
	{
		//根据买的数量创建笼子
		 Cage* pCage = new Cage;
		 //编号自动生成
		 pCage->Id = house.lstcage.size() + 1;
		 pCage->pAnimal = nullptr;
		//添加到房子的链表中
		 house.lstcage.push_back(pCage);
	}
	

}
void Anne::PushAnimal(House& house, int nId, Animal* pAnimal)
{
	//找到指定房间编号的笼子
	
	//判断笼子中是否有动物
		//没有 放入
		
		// 有  提示
	list<Cage*>::iterator ite = house.lstcage.begin();
	while (ite != house.lstcage.end())
	{
		if ((*ite)->Id == nId)
		{
			if ((*ite)->pAnimal == nullptr)
			{
				(*ite)->pAnimal = pAnimal;
			}
			else
			{
				cout << "编号为【" << nId << "】的笼子有动物了" << endl;
			}
			return;
		}
		ite++;
	}
	cout << "没有找到编号为" << nId << "的笼子" << endl;
}
void Anne::PopAnimal(House& house, int nId)
{
	//找到指定房间编号的笼子

	//判断笼子中是否有动物
		//没有 提示
		
		// 有  提删除
	list<Cage*>::iterator ite = house.lstcage.begin();
	while (ite != house.lstcage.end())
	{
		if ((*ite)->Id == nId)
		{
			if ((*ite)->pAnimal != nullptr)
			{
				delete (*ite)->pAnimal;
				(*ite)->pAnimal = nullptr;
			}
			else
			{
				cout << "编号为【" << nId << "】的笼子没有动物" << endl;
			}
			return;
		}
		ite++;
	}
	cout << "没有找到编号为" << nId << "的笼子" << endl;
}
void Anne::See(House& house)
{
	//遍历房间中笼子
	
	//有动物 Show

	//没有动物  提示
	list<Cage*>::iterator ite = house.lstcage.begin();
	while (ite != house.lstcage.end())
	{
		if ((*ite)->pAnimal != nullptr)
		{
			(*ite)->pAnimal->Show();
		
		}
		else
		{
			cout << "----NULL----" << endl;
		}
		cout << "-----------------------------------------" << endl;
		ite++;
	}
	
}
void Anne::PlayWithAnimal(House& house, int nId)
{
	//找到指定房间编号的笼子

	//判断笼子中是否有动物
		//有  

		//没有
	list<Cage*>::iterator ite = house.lstcage.begin();
	while (ite != house.lstcage.end())
	{
		if ((*ite)->Id == nId)
		{
			if ((*ite)->pAnimal != nullptr)
			{
				(*ite)->pAnimal->Play();
				cout << "跟小动物玩真开心" << endl;
			}

			else
			{
				cout << "编号为【" << nId << "】的笼子里没有小动物" << endl;
				cout << "自己玩不开心" << endl;
			}
			return;
		}
		ite++;
	}
	cout << "没有找到编号为" << nId << "的笼子" << endl;
	cout << "自己玩不开心" << endl;
}
#include "Cage.h"

Cage::Cage()
{
	pAnimal = nullptr;
	Id = 0;
}
Cage::~Cage()
{
	if (pAnimal != nullptr)
	{
		delete pAnimal;
		pAnimal = nullptr;
	}
}
#include "Cat.h"

void Cat::Play()
{
	cout << "玩毛球" << endl;
}
#include "Dog.h"




void Dog::Play()
{
	cout << "接飞盘" << endl;
}
#include "House.h"



House:: ~House()
{
	list<Cage*>::iterator ite = lstcage.begin();
	while (ite != lstcage.end())
	{
		delete* ite;
		ite++;
	}
}
#include "Snake.h"


void Snake::Play()
{
	cout << "伸舌头" << endl;
}

五、总结

通过此次实例更加熟悉的类图整个框架的制作以及4个横向关系(组合、依赖、聚合,关联)和继承的使用,并且熟悉掌握了纯虚函数的用法,对于多态的深入理解,最后知道了容器的使用方法和迭代器的使用。要熟练掌握他们之间的逻辑结构。例如每个容器都有专属的迭代器,而算法通过迭代器对容器中的元素进行操作,容器能够通过模版的方法,装下各种类型的节点元素。

所以迭代器是一种行为类似指针的对象。迭代器所指向的对象为容器中元素(结构体)的节点。

如定义一个 class   List  的容器 ,容器的节点为ListItem,那么迭代器就应该指向(的对象)容器中的ListItem节点。

而迭代器通过重载 * (解引用)运算符,从而就可以得到节点的值。通过重载operator -> 运算符就可以得到容器节点地址(指针)。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
【资源说明】 基于C++开发的宠物小屋源码+项目说明+sln解决方案(课程设计).zip 基于C++开发的宠物小屋源码+项目说明+sln解决方案(课程设计).zip 基于C++开发的宠物小屋源码+项目说明+sln解决方案(课程设计).zip 1、该资源内项目代码都是经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载使用,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能。 【需求分析】 需求分析: 动物猫(CCat)、狗(CDog)、蛇(CSnake),包含名字(m_strName)、颜色(m_strColor)、年龄(m_nAge)。 笼子类(CCage):它负责装3种动物,每个笼子编号不能相同。 房子类(CHouse):负责存放装动物的笼子。 人(CPeople):负责花钱买动物,造笼子,将动物放到笼子中,存放到房子里,杀死某个笼子动物,销毁某个笼子(如果有动物一并销毁), 查看某个或所有笼子动物,和某个动物玩耍。 控制台程序,通过输入命令,可以进行简单的人机交互。 提示:获取输入字符可以用 string::getline(cin, cmd); //获取输入的命令(阻塞等待) #include<string> basic_istream<_Elem, _Traits>& getline( basic_istream<_Elem, _Traits>& _Istr, basic_string<_Elem, _Traits, _Alloc>& _Str, const _Elem _Delim) _Istr :表示一个输入流,譬如cin. _Str :将输入流读取的字符串放到_Str 中。 _Delim:遇到这个字符就停止读取,不设置默认为'\n' 本项目是作者初学C++中类相关知识的时候写的一个练习使用类的小项目。 > - 类之间的横向关系和纵向关系是C++中很重要的一部分知识点,初学C++者通过练习这个项目可以加深对C++中类之间关系的理解,可以对理论上的相关概念加以实践练习,对学习C++很有帮助。 > - 如发现源代码中有错误或者有其它问题,欢迎大家在 `Issues` 中研究讨论,欢迎大家 `Fork` 和 `Pull requests` 改善代码,十分感谢! ## 使用语言 - C++ ## 主要技术 * **类的使用练习** ## 项目整体思路 - 文件中有项目的需求分析文档,还有项目的类图分析文档,通过这些很容易上手练习这个小项目。 - 项目中使用的是通过控制台输入命令来简单交互的,感兴趣的可以加上图形用户界面。 ## 运行 - 使用 Visual Studio 打开项目中的.sln文件,编译运行即可。 - 作者之前使用的VS2012是可以正常运行的,不同的版本可能会有一点点小问题,但都很容易解决。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值