14.7 添加职工

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;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值