步骤
先创建出员工管理类,实现和声明分开写,.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;
}