职工管理系统(代码回顾1)
该项目综合的知识点较多,包括内存管理,面向对象的三大特性封装、继承、多态都有涉及到,而且包括文件操作,现分别进行总结。
0、项目需求如下:
1、主函数框架
1 int main()
2 {
3 //实例化管理者对象
4 WorkerManager wm;
5 //用户选择
6 int choice = 0;
7 while (true)
8 {
9 wm.ShowMenu();
10 cout << "请输入您的选择: " << endl;
11 cin >> choice;
12 switch (choice)
13 {
14 case 0://退出系统
15 wm.ExitSystem();
16 break;
17 case 1://添加职工
18 wm.AddEmp();
19 break;
20 case 2://显示职工
21 wm.Show_Emp();
22 break;
23 case 3://删除职工
24 wm.Del_Emp();
25 break;
26 case 4://修改职工
27 wm.Mod_Emp();
28 break;
29 case 5://查找职工
30 wm.Find_Emp();
31 break;
32 case 6://排序职工
33 wm.Sort_Emp();
34 break;
35 case 7://清空文件
36 wm.Clean_File();
37 break;
38 default:
39 system("cls");//清屏
40 break;
41 }
42 }
43 system("pause");
44 return 0;
45 }
2、创建管理类
管理类负责的内容包括:与用户交互的菜单界面、对职工增删改查的操作、与文件读写交互
其中的各属性和行为在程序完成的过程中逐渐添加
#pragma once
#include <iostream>
#include "worker.h"
using namespace std;
class WorkerManager
{
public:
//构造函数
WorkerManager();
//展示菜单
void ShowMenu();
//退出系统
void ExitSystem();
//记录职工人数
int m_EmpNum;
//职工数组指针
Worker** m_EmpArray;
//添加职工函数
void AddEmp();
//保存文件函数
void Save();
//标志文件是否为空
bool FileIsEmpty;
//文件非空,获取职工人数
int get_EmpNum();
//文件非空,初始化函数
void init_Emp();
//显示职工
void Show_Emp();
//删除职工
void Del_Emp();
//修改职工信息
void Mod_Emp();
//查找职工
void Find_Emp();
//检测职工是否存在,存在返回位置,不存在返回-1
int IsExit(int id);
//按照职工编号排序
void Sort_Emp();
//清空文件
void Clean_File();
//析构函数
~WorkerManager();
};
3、抽象职工基类和三种具体职工派生类
需求中具体的职工分为三类:普通职工、经理、老板,可以考虑创建一个抽象的职工类,里面包含着需要的属性和行为,成员函数均为纯虚函数,子类通过继承然后重写基类的虚函数,去创建相应的派生类。创建的抽象类如下:
6 //设计worker抽象类
7 class Worker
8 {
9 public:
10 //岗位信息描述
11 virtual void ShowInfo() = 0;
12 //获取岗位名称
13 virtual string GetDeptName() = 0;
14 int m_ID;
15 string m_Name;
16 int m_DeptID;
17 };
通过继承,创建普通职工类,经理类,老板类如下:
(文件只编译一次,包含父类的头文件,添加的成员函数包括自身的构造函数、重写父类的虚函数,在头文件中只做声明,去源文件中实现)
7 class Employee : public Worker
8 {
9 public:
10 //构造函数
11 Employee(int id, string name, int deptid);
12 //岗位信息描述
13 virtual void ShowInfo();
14 //获取岗位名称
15 virtual string GetDeptName();
16 };
7 class Manager : public Worker
8 {
9 public:
10 //构造函数
11 Manager(int id, string name, int deptid);
12 //岗位信息描述
13 virtual void ShowInfo();
14 //获取岗位名称
15 virtual string GetDeptName();
16 };
7 class Boss : public Worker
8 {
9 public:
10 //构造函数
11 Boss(int id, string name, int deptid);
12 //岗位信息描述
13 virtual void ShowInfo();
14 //获取岗位名称
15 virtual string GetDeptName();
16 };
以普通职工为例,源文件为:
构造函数中初始化职工编号、姓名等属性,采用有参构造的方式,传入的职工编号、姓名等赋值给对象的属性
成员函数有展示岗位信息函数,以及获取岗位名称函数
1 #include "employee.h"
2 //构造函数
3 Employee::Employee(int id, string name, int deptid)
4 {
5 this->m_ID = id;
6 this->m_Name = name;
7 this->m_DeptID = deptid;
8 }
9 //岗位信息描述
10 void Employee::ShowInfo()
11 {
12 cout << "职工编号: " << this->m_ID
13 << "\t职工姓名: " << this->m_Name
14 << "\t部门编号: " << this->GetDeptName()
15 << "\t职责是完成老板交代的任务" << endl;
16 }
17 //获取岗位名称
18 string Employee::GetDeptName()
19 {
20 return "职工";
21 }