14.7 添加职工
1、功能分析
用一个数组去保存所有用户添加的职工,但我们知道,数组里只能存放相同类型的元素。多态技术正好满足的这一需求。
例如,创建普通员工时可以这样写:
Worker * worker = new Employee;
创建经理时可以这样写:
Worker * worker = new Manager;
这样,这个数组里保存的其实都是Worker *类型的数据了。
再分析一下,这个数组应该创建再堆区,因为堆区的数据时由程序员手动释放,这样不会像局部变量那样一个函数调用完就释放掉了,而在整个程序运行期间,我们都可以随时随地使用这个数组。
因为数组里保存的数据类型是 Worker * ,所以在定义这个数组时要这样定义:
Worker ** worker[] = new Worker*[32];
数组的长度可以先设置一个值,当添加的职工数超过了初始值,可以再另开辟一段更大空间,重新记录职工信息。
2、在workerManager类中添加属性并在构造函数中初始化:
#pragma once
#include "worker.h"
using namespace std;
class WorkerManager
{
public:
//构造函数
WorkerManager();
//展示菜单
void Show_Menu();
//退出系统
void ExitSystem();
//析构函数
~WorkerManager();
//记录当前人数
int m_EmpNum;
//记录数组的指针
Worker** m_EmpArray;
};
WorkerManager::WorkerManager()
{
this->m_EmpNum = 0;
this->m_EmpArray = NULL;
}
3、在workerManager.h中添加成员函数
//添加新职工
void AddEmp();
4、在workerManager.cpp中实现成员函数
//添加职工
void WorkerManager::AddEmp()
{
cout << "请输入添加职工的数量:";
int addNum = 0;
cin >> addNum;
if (addNum > 0)
{
//计算新空间大小
int newSize = this->m_EmpNum + addNum;
Worker** newSpace = new Worker *[newSize];
//将原来的数据拷贝到新空间
if (m_EmpArray != NULL)
{
for (int i = 0; i < m_EmpNum; i++)
{
newSpace[i] = m_EmpArray[i];
}
}
//开始添加新数据
for (int i = 0; i < addNum; i++)
{
int id;
string name;
int dSelect;
cout << "请输入第" << i + 1 << "个新职工的编号:";
cin >> id;
cout << "请输入第" << i + 1 << "个新职工的姓名:";
cin >> name;
Worker* worker = NULL;
while (true)
{
cout << "请输入第" << i + 1 << "个新职工的岗位:" << endl;;
cout << "1、普通职工" << endl;
cout << "2、经理" << endl;
cout << "3、老板" << endl;
cin >> dSelect;
switch (dSelect)
{
case 1:
worker = new Employee(id, name, dSelect);
break;
case 2:
worker = new Manager(id, name, dSelect);
break;
case 3:
worker = new Boss(id, name, dSelect);
break;
default:
cout << "输入的数据有误,请重新选择" << endl;
break;
}
if (worker != NULL)
{
break;
}
}
newSpace[m_EmpNum + i] = worker;
}
delete[]this->m_EmpArray;
//更改新空间指向
this->m_EmpArray = newSpace;
m_EmpNum = newSize;
cout << "成功添加了" << addNum << "名新职工!" << endl;;
}
else
{
cout << "数据有误" << endl;
}
}
这个功能较为复杂,仔细分析代码,看看具体的实现原理。目前还没涉及到文件交互。
5、析构释放资源
WorkerManager::~WorkerManager()
{
if (this->m_EmpArray != NULL)
{
for (int i = 0; i < this->m_EmpNum; i++)
{
delete this->m_EmpArray[i];
this->m_EmpArray[i] = NULL;
}
}
delete[] this->m_EmpArray;
this->m_EmpArray = NULL;
}