添加职工功能
功能描述:批量添加职工,并且保存到文件中
功能分析:
- 用户在批量创建时,可能会创建不同种类(普通员工、经理、老板)的职工
- 如果想将所有不同种类的员工都放入到一个数组中,可以将所有员工的指针维护到一个数组里
- 如果想在程序中维护这个不定长度的数组,可以将数组创建到堆区,并利用Worker的指针维护
步骤:
- 在WokerManager.h头文件中添加成员属性,记录职工人数和创建指针数组
- 在WorkerManager构造函数中初始化属性
- 在WokerManager.h添加成员函数,添加职工函数实现添加职工
- 在workerManager.cpp中实现该函数
- 由于在WokerManager.h头文件中添加了指针数组,即创建了堆区数据,需要在workerManager.cpp中手动释放
代码
1.WokerManager.h头文件中添加成员属性和成员函数,需要包含头文件#include “Worker.h”
void Add_Emp();//添加职工功能
//成员属性
int m_EmpNum;//记录职工人数
Worker** m_EmpArray;//职工数组指针,二级指针
2.WorkerManager.cpp的构造函数中初始化属性,并写成员函数实现
//构造函数中初始化成员属性
WorkerManager::WorkerManager()//在*具体实现一*中这里是空实现,当时没有添加成员属性
{
this->m_EmpNum = 0;//记录职工人数,初始化属性
this->m_EmpArray = NULL;//职工数组指针,初始化属性
}
//添加职工功能
void WorkerManager::Add_Emp()
{
cout << "请输入添加职工数量" << endl;
int addNum = 0;
cin >> addNum;
if (addNum > 0)
{
//添加
//计算添加新空间的大小
int newSize = this->m_EmpNum + addNum;//新空间人数=原记录人数+新增人数
//开辟新空间
Worker** newSpace = new Worker * [newSize];
//将原空间数据拷贝到新空间
if (this->m_EmpArray != NULL)
{
for (int i = 0; i < this->m_EmpNum; i++)
{
newSpace[i] = this->m_EmpArray[i];
}
}
//批量添加新职工
for (int i = 0; i < addNum; i++)
{
//首先要输入新职工的信息
int id;//职工编号
string name;//职工姓名
int deptid;//职工岗位
cout << "请输入第" << i + 1 << "个" << "新职工编号" << endl;
cin >> id;
cout << "请输入第" << i + 1 << "个" << "新职工姓名" << endl;
cin >> name;
cout << "请选择该职工岗位:" << endl;
cout << "1——普通员工" <<endl;
cout << "2——经理" << endl;
cout << "3——总裁" << endl;
cin >> deptid;
//根据新职工的岗位来创建不同的职工类别 普通员工、经理、总裁
Worker* worker = NULL;//创建父类指针来指向子类对象
switch (deptid)
{
case 1:
worker = new Employee(id, name, 1);
break;
case 2:
worker = new Manager(id, name, 2);
break;
case 3:
worker = new Boss(id, name, 3);
break;
default:
break;
}
//将创建职工指针保存到新数组中
newSpace[this->m_EmpNum + i] = worker;//在原来职工后加新员工
}
//释放原有的数组空间 注意要加[]
delete[] this->m_EmpArray;
//更改新数组空间指向
this->m_EmpArray = newSpace;
//更新职工人数
this->m_EmpNum = newSize;
//提示信息
cout << "成功添加" << addNum << "名新职工!" << endl;
}
else
{
cout << "输入数据有误" << endl;
}
system("pause");//请按任意键继续
system("cls");
}
WorkerManager::~WorkerManager()
{
if (this->m_EmpArray != NULL)
{
delete[] this->m_EmpArray;
}
}
注意:
- 在添加新职工时,原来的空间大小肯定不够,需要开辟新的空间大小来存放新的职工:
首先,要明确新空间人数=原记录人数+新增人数,int newSize = this->m_EmpNum + addNum;
其次,这个新空间是一个动态的指针数组,内存大小不能写死了,new Worker*[newSize]
然后,要用之前提到的二级指针来接收这个新开辟的指针数组,Worker** newSpace = new Worker * [newSize]
- 如果原来有职工,再添加新职工时:
首先,要判断原来是否有职工存在,如果有,则需要把原来的职工拷贝到新空间,再进行添加新职工
其次,添加新员工时要输入新员工的编号、姓名、岗位信息
然后,通过父类指针指向子类对象来存放不同职工类的信息,并放入新指针数组中,在WokerManager.h中包含三个职工类的头文件
最后,要释放原来的数组空间,并把指针数组指向新的空间,更新职工人数
测试:在main函数中调用添加职工功能
int main()
{
//1. 实例化管理者对象测试
WorkerManager wm;
int choice = 0;
while (true)
{
//调用展示菜单成员函数
wm.Show_Menu();
cout << "请输入你要选择的功能:" << endl;
cin >> choice;
switch(choice)
{
case 0:
wm.exitSystem();
break;
case 1://添加职工
wm.Add_Emp();
break;
default:
system("cls");//清屏
break;
}
}
system("pause");
return 0;
}
问题:虽然可以添加职工 了,但是并没有文件来保存数据,因此在添加功能中还差一步把新数据保存到文件中,通过文件交互来实现。