指针初始化类 && 普通变量初始化类
抽象基类worker,只需编写 .h ,无需 .cpp 底层实现
类 记得声明权限public!!!不然默认private,主函数访问不了
记得继承父类
Worker * worker:指向Worker类型对象的指针 = 地址
Worker ** worker_Array:(动态) 指针数组,即数组每一个元素都是指向Worker类型对象的指针=地址
初始化动态数组(数组首地址指针+人数)
批量添加成员功能实现
1.需添加人数addNum是否大于0
addNum > 0
2.求新动态数组的空间大小newSize
newSize=this->EmpNum+addNum
3.生成新动态数组去的地址newSpace(注意格式)
Worker ** newSpace=new worker * [newSize]
4.将原来数组内容复制到新数组里面
for循环:newSpace[i] = this->EmpArray[i];
5.将人员信息打包封装,new分配空间(指针)
wok = new Employee(id, name, 1);
6.将打包好的对象加入新数组
newSpace[this->EmpNum + i] = wok;
7.释放原数组空间(已废弃)
delete[ ] this->EmpArray;
8.更新指向,指向新数组
this->EmpArray = newSpace;
9.更新成员个数,为新数组个数
this->EmpNum = newSize;
void workerManager::Add_EMP()
{cout << "请输入添加的人数" << endl;int addNum = 0;cin >> addNum;if (addNum > 0) {//添加新的数组空间大小int newSize = this->EmpNum + addNum;//开辟新空间,新数组的地址worker** newSpace = new worker * [newSize];//将原空间地址的内容存放到新空间下(复制)if (this->EmpArray != NULL){for (int i = 0; i < this->EmpNum; i++){newSpace[i] = this->EmpArray[i];}}//输入新数据(批量添加)for (int i = 0; i < addNum; i++){int id;string name;int dSelect; //职位cout << "请输入第" << i + 1 << "个职工的id" << endl;cin >> id;cout << "请输入第" << i + 1 << "个职工的name" << endl;cin >> name;cout << "亲选择岗位:1.员工 2.经理 3.总裁" << endl;cin >> dSelect;//注意:此时体现多态的重要性//初始化为基类worker,初始化为NULLworker* wok = NULL;//选择岗位,switch实现switch (dSelect){case 1://给指针分配空间wok = new Employee(id, name, 1);break;case 2:wok = new manager(id, name, 1);break;case 3:wok = new Boss(id, name, 1);break;default:break;}//将刚创建的对象加入数组中newSpace[this->EmpNum + i] = wok;}//释放原有空间delete[] this->EmpArray;//更新新空间的指向,更新地址this->EmpArray = newSpace;//更新数组成员个数this->EmpNum = newSize;//提示信息cout << "添加成功!" << endl;}else{cout << "输入错误" << endl;}//按任意键system("pause");//清屏操作system("cls");}
针对三种文件情况,构造初始化
文件不存在 创建文件
初始化构造(读文件)
workerManager::workerManager()
{//文件不存在ifstream ifs;ifs.open("test", ios::in);//读文件if (!ifs.is_open())//文件为空{cout << "文件不存在" << endl;//构造初始化this->EmpNum = 0;this->EmpArray = NULL;//初始化文件标志,默认为空this->FileEmpty = true;//关闭文件ifs.close();return;}}
文件存在 数据为空
文件结尾为 eof,用于判断是否为空(读文件)
//文件存在,但数据为空char ch;ifs >> ch;if (ifs.eof()){cout << "文件为空" << endl;//构造初始化this->EmpNum = 0;this->EmpArray = NULL;//初始化文件标志,默认为空this->FileEmpty = true;//关闭文件ifs.close();return;}
显示职工信息功能
void workerManager:: Show_Emp()
{if (this->FileEmpty){cout << "文件不存在or记录为空" << endl;}else{for (int i = 0; i < EmpNum; i++){//多态调用接口,数组成员均为workerthis->EmpArray[i]->showInfo();}}
}
查找目标职工在数组中的位置
主要思路:
遍历数组查找需删除对象在数组中的位置 index,不存在则返回-1
int workerManager::IsExist(int id)
{int index = -1;for (int i = 0; i < this->EmpNum; i++){if (this->EmpArray[i]->ID == id){index = i; //找到职工break;}}return index;
}
删除职工信息
数组成员 前移
void workerManager::Del_Emp()
{if (this->FileEmpty){cout<< "文件不存在" << endl;}else{cout << "请输入需删除职工编号" << endl;int id = 0;cin >> id;int index = this->IsExist(id);if (index != -1){for (int i = index; i < this->EmpNum - 1; i++){//数据前移this->EmpArray[i] = this->EmpArray[i + 1];}this->EmpNum--; //人数--this->save(); //数据同步更新到文件中cout << "删除成功" << endl;}else{cout << "未找到该职工" << endl;}system("pause");system("cls");}
}
修改职员信息
1.是否存在
2.删除该职工
3.重写职工信息
void workerManager::Mod_Emp()
{int id;cin >> id;int ret = this->IsExist(id);if (ret != -1){delete this->EmpArray[ret];int newId = 0; string newName = "";int dSelect = 0; //岗位cin >> newId;cin >> newName;cin >> dSelect;//多态创建人员,初始化空指针worker* wok = NULL;switch (dSelect){case 1://给指针分配空间wok = new Employee(newId, newName, dSelect);break;case 2:wok = new manager(newId, newName, dSelect);break;case 3:wok = new Boss(newId, newName, dSelect);break;default:break;}//写入数组this->EmpArray[ret] = wok;}else { cout << "未找到需修改职工" << endl; }
}
选择排序
清空