該項目綜合的知識點較多,包括記憶體管理,面向對象的三大特性封裝、繼承、多態都有涉及到,而且包括文件操作,現分別進行總結。 0、項目需求如下: 1、主函數框架 1 int main() 2 { 3 //實例化管理者對象 4 WorkerManager wm; 5 //用戶選擇 6 int choice ...
該項目綜合的知識點較多,包括記憶體管理,面向對象的三大特性封裝、繼承、多態都有涉及到,而且包括文件操作,現分別進行總結。
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 }