职工管理系统_201009(思路详解版-第一步添加职工)

步骤

先创建出员工管理类,实现和声明分开写,.h当中仅仅声明,具体实现在workerMangager.cpp当中,验证在**main()**当中

包含关系

员工类

员工类employee,包含在职工类worker当中,属于职工类的子类。
职工类中有各类成员属性显示个人信息获取岗位名称的纯虚函数,父类中的纯虚函数不需要实现,=0即可。

子类从父类当中继承属性,并且对纯虚函数进行具体实现,显示出信息、岗位名称。

在这里有个出错点

父类指针指向子类对象,去实现子类当中的纯虚函数showInfo(),在父类当中的纯虚函数忘记 = 0了
在这里插入图片描述

经理类

经理类manager同样继承自职工类worker的属性,是职工类的子类,在声明中重写父类中的纯虚函数,并在.cpp实现中完成

老板类

老板类boss同样继承自职工类worker的属性,是职工类的子类,在声明中重写父类中的纯虚函数,并在.cpp实现中完成

添加职工

使用多态统一指针,用父类指针去指向子类对象,使用数组保存住父类指针。

需要在堆区去开辟空间,保存父类指针指向的子类对象的数据,那么要去维护这些地址里的数据的话,就需要用指针的指针,去指向做这些保存有子类数据的地址(二级指针)。

指向worker*的指针就是**worker****。

p = &x //x相当于 char *
p2 = &p; // p == char **

workerManager.cpp中去实现我们的7种功能

Add_Emp()添加职工函数

//开辟新空间
		Worker ** newsapce = new Worker *[newsize];

这里的worker *[newsiaze],创建了一个数组,里面的元素都是worker *类型,都是指向子类对象的父类指针。
因为对于属性、函数实现,子类都是从父类中继承的。

Worker * worker = NULL; //50行

在输入新的数据的时候,需要让父类指针先为空,初始化指针,防止它指向别的地方出现野指针问题,且方便后面的指向。

代码块1

			//66行:把我们的父类指针保存到数组里去,数组里保存的都是指向不同子类的父类指针woker
			//父类指针指向了新的子类对象
			newsapce[this->m_EmpNum + i] = worker; 			//将新的父类指针存放进信数组的第i位中

代码块2

		//75行: 这里的newsapce是新开辟的数组空间,保存有新的父类指针和之前数组中存在的父类指针
		//在构造函数中,我们让指针的指针(维护父类指针的指针)为空了
		//这里需要把新的数组地址给了它
		//让它去维护新的数组
		this->m_EmpArray = newsapce; 				//更改新的指向

save()保存文件函数

代码理解1给文本添加数据

在这里插入图片描述

	for (int i = 0; i < this->m_EmpNum; i++)
	{
		//包含三层信息 
		ofs << this->m_EmpArray[i]->m_Id << " "
			<< this->m_EmpArray[i]->m_Name << " "
			<< this->m_EmpArray[i]->m_DeptId << endl;
	}

文件存在,但是为空

	//文件存在,并且没有记录
	char ch;
	ifs >> ch;
	if (ifs.eof()) 	//ifs会读取第一个字符,若第一个字符为字符串结束标志'\0'文件的末尾,就会为真,进入判断
	{
		cout << "文件不存在" << endl; 			//测试输出 
		this->m_EmpNum = 0;  	//初始化人数 
		this->m_FileIsEmpty = true; 	//初始化文件为空标志 
		this->m_EmpArray = NULL; 	//初始化数组 
		ifs.close(); 	//关闭文件
		return;
	}

获取从文本读取的人数int get_EmpNum()

ifs.open(FILENAME, ios::in);//打开文件,读文件

while (ifs >> id && ifs >> name && ifs >> did) //右移的方式去读取每行数据

初始化职工init_Emp()

	//3.读取文件中的人数
	int num = this->get_EmpNum();
	cout << "文件存在且有内容,职工个数为:" << num << endl;
	this->m_EmpNum = num;
														//按照人数在堆区开辟对应大小的空间
	this->m_EmpArray = new Worker *[this->m_EmpNum];	//新开辟好了空间,数组大小m_EmpNum就是之前统计到的人数,但是里面尚未有内容存在
	
	
	this->init_Emp();		//读取文本中的内容,把读取到的新的对象信息,更新存储进我们的数组里
	
	for (int i = 0; i < m_EmpNum; i++)		//测试代码,显示更新存储进数组里的内容
	{
		cout << "职工号: " << this->m_EmpArray[i]->m_Id
			<< " 职工姓名: " << this->m_EmpArray[i]->m_Name
			<< " 部门编号: " << this->m_EmpArray[i]->m_DeptId << endl;
	}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 8
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

扳手的海角

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值