C++之职工管理系统(细节Q)
指针初始化类 && 普通变量初始化类
抽象基类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,初始化为NULL
worker* 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++)
{
//多态调用接口,数组成员均为worker
this->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; }
}
选择排序
清空