Linux环境下C++基于多态的后宫管理系统
实现如下几个功能
后宫每位佳丽都有4个属性,分别是编号、姓名、颜值、身份
并且把数据保存到文件中,保证数据不会在程序结束时流失,下一次使用还可以恢复以前的数据
让我们来看看添加功能
当输入正确时添加成功
当输入编号已经存在或者身份不对时,提示输入失败
显示功能,输入2显示所有人信息
删除功能
两种模式,姓名模式输入要删除的姓名,编号模式输入要删除的编号,当有重名人时,不能用姓名模式删除,当输入的编号或姓名不存在时,提示用户不存在
其他经过测试都是成功的,就不一一放图了
修改功能也是姓名和编号两种方式查找,找到了重新输入信息,找不到提示不存在
排序功能有4个模式,按照编号的升降序和按照颜值的升降序。
查看功能就是输入姓名或者编号,存在则打印这个人的信息
不存在则提示不存在
程序源码:
#include"iostream"
#include"stdlib.h"
#include"string"
#include"fstream"
#define FILENAME "a.txt"
using namespace std;
//枚举类型,(退出,添加,显示,删除,修改,排序,查找)
enum
{
quit,
add,
display,
del,
alter,
sort,
Find,
};
//女孩类,抽象类,无法实例化
class girl
{
public:
//纯虚函数
virtual void work() = 0;
//编号
int num;
//姓名
string name;
//颜值
int yanzhi;
//身份
int sf;
};
//女朋友类,继承女孩类
class girlfriend : public girl
{
public:
//参数构造函数,初始化编号、姓名、颜值,女朋友类的身份统一初始化为1
girlfriend(int a, string b, int c)
{
sf = 1;
num = a;
name = b;
yanzhi = c;
}
//多态,重写父类的纯虚函数,实现打印信息
void work()
{
cout << "编号: " << num << " "
<< "\t姓名: " << name << " "
<< "\t颜值: " << yanzhi << " "
<< "\t身份: 女友" << endl;
}
};
//备胎类,也是女孩类的子类,继承了女孩类,功能同上,身份为2
class spare : public girl
{
public:
spare(int a, string b, int c)
{
sf = 2;
num = a;
name = b;
yanzhi = c;
}
void work()
{
cout << "编号: " << num << " "
<< "\t姓名: " << name << " "
<< "\t颜值: " << yanzhi << " "
<< "\t身份: 备胎" << endl;
}
};
//丑女类,叫丑女不太好,就称之为潜力股把,功能同上,身份为3
class ugly : public girl
{
public:
ugly(int a, string b, int c)
{
sf = 3;
num = a;
name = b;
yanzhi = c;
}
void work()
{
cout << "编号: " << num << " "
<< "\t姓名: " << name << " "
<< "\t颜值: " << yanzhi << " "
<< "\t身份: 潜力股" << endl;
}
};
//管理类,包含该系统的各种功能
class guanli
{
public:
int nowmemory;//记录当前内存空间大小
int point;//位置指针,永远指向第一个空的元素,同时记录元素个数
girl **gr;//女孩类指针数组
girl **newgr;//扩容用的零时女孩类指针数组
//构造函数,初始化数组元素为2,当前内存空间为2,位置指针指向0号元素,同时记录数组现有0个元素
guanli()
{
gr = new girl*[2];
nowmemory = 2;
point = 0;
}
//析构函数,释放堆空间
~guanli()
{
for(int i=0; i<point ;i++)
{
delete gr[i];
gr[i] = NULL;
}
delete gr;
gr = NULL;
delete newgr;
newgr = NULL;
}
//扩容,当前内存已经存满时,调用该函数实现扩容
void kuoron()
{
nowmemory+=2;//当前容量加2
newgr = new girl*[nowmemory];//开辟新的更大的堆空间
if(gr != NULL)//如果开辟成功
{
//复制原来空间的内容到当前空间,并且释放掉原来的空间
for(int i=0; i<point; i++)
{
newgr[i] = gr[i];
}
delete gr;
gr = newgr;
}
}
//初始化,从文件中读取数据到堆空间
void init()
{
ifstream fp;//创建只读文件流
fp.open(FILENAME, ios::in);//以只读方式打开
if( !fp.is_open() )//判断打开是否成功
{
cout << "打开文件失败" << endl;
return;
}
//编号、姓名、颜值、身份的零时变量
int n;
string str;
int yz;
int sf;
//读取文件中数据,根据身份创建不同的子类空间,统一用父类指针维护
while(fp >> n && fp >> str && fp >> yz && fp >> sf)
{
if(point >= nowmemory)//若空间满,则扩容
{
kuoron();
}
if(sf == 1)
{
gr[point] = new girlfriend(n, str, yz);
}
if(sf == 2)
{
gr[point] = new spare(n, str, yz);
}
if(sf == 3)