C++ 职工管理系统 具体实现(三)-添加职工功能

添加职工功能

功能描述:批量添加职工,并且保存到文件中

功能分析

  • 用户在批量创建时,可能会创建不同种类(普通员工、经理、老板)的职工
  • 如果想将所有不同种类的员工都放入到一个数组中,可以将所有员工的指针维护到一个数组里
  • 如果想在程序中维护这个不定长度的数组,可以将数组创建到堆区,并利用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;
	}
}

注意

  1. 在添加新职工时,原来的空间大小肯定不够,需要开辟新的空间大小来存放新的职工:
    首先,要明确新空间人数=原记录人数+新增人数,int newSize = this->m_EmpNum + addNum;
    其次,这个新空间是一个动态的指针数组,内存大小不能写死了,new Worker*[newSize]
    然后,要用之前提到的二级指针来接收这个新开辟的指针数组,Worker** newSpace = new Worker * [newSize]
  2. 如果原来有职工,再添加新职工时:
    首先,要判断原来是否有职工存在,如果有,则需要把原来的职工拷贝到新空间,再进行添加新职工
    其次,添加新员工时要输入新员工的编号、姓名、岗位信息
    然后,通过父类指针指向子类对象来存放不同职工类的信息,并放入新指针数组中,在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;
}

问题:虽然可以添加职工 了,但是并没有文件来保存数据,因此在添加功能中还差一步把新数据保存到文件中,通过文件交互来实现。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值