项目开发文档:职工管理系统
项目要求
职工管理系统,管理所有员工信息;
交互界面:显示界面,退出界面
系统基本功能:增加职工,查找职工,修改职工,查找职工
系统附加功能:显示所有职工,清空职工,职工按需排序
其他:数据需要可持续化,这里采用文件作为数据库;
项目配置
开发环境:Windows + VS2019
语言: C++
开发流程
- 在之前的项目里,所有的功能我们直接写成全局函数,在接受了类的概念后,现在我们将系统的所有功能封装在一个系统 管理类或者说控制类;
所以我们可以先创建一个WorkManager类,然后将系统的功能都封装在这个类里,最后用WorkManager类实例化出的对象,使用这些功能;这就是典型的面向对象编程;我们需要思考函数或者变量,属于什么对象,然后创建出这个对象的类,之后用这个类实例化出的对象,进行操作; - 实现交互界面,交互界面也就是交互功能也属于这个系统,所以我们定义一个显示菜单,和退出菜单函数,然后封装在这个WorkManager类里;
- 然后就是菜单的逻辑,使用switch结构实现,通过不同的case跳转进不同的功能;
- 我们需要职工对象,然后也需要职工对象派生出来的老板对象,经理对象,员工对象;这种很明显具有继承或者说派生关系的模型,我们采取多态的形式去写;当具有分类关系,或者说多个对象可以抽象出一个共同的对象的时候,那我们就考虑多态来写;这里我们直接定义一个抽象职工类,然后根据多态的写法,定义老板类,经理类,员工类,重写职工类里的虚函数;然后对于职工信息,这里按照要求,只考虑几点,职工编号,姓名,职务;
- 之后便是实现基本功能,crud,这些功能属于系统管理类,所以我们将其封装金WorkManager类里;
- 增加职工,肯定需要一个数据结构来存储职工信息,这里选用数组,但是有一个问题,职工有很多种,但是数组只能存储同一种数据类型,如何解决;
这里采取一个通用的办法,那就是直接定义一个元素类指针数组,这里的元素类其实就是通用的是职工类;所以我们直接定义职工类指针数组;就可以保证数组里存储的数据类型 都是同一种 也就是 职工类指针类型;
职工类指针数组定义 就是 Worker** array 或者 Worker* array[],两种方式都可以,因为数组名 其实就是数组首地址,也可以理解成一个指针常量,指针存储的地址不变;a[] 和 * a 两种方式都可以定义一个数组;定义数组其实本质上是定义了一个数组指针,同时开辟了一些内存给数组,然后我们用数组指针存储数组的首地址 或者说 指向这个数组; - 现在考虑一下,系统初始化,我们将初始化所需要的工作,都放入系统的构造函数里,也就是WorkManager类的构造函数里,
构造函数就是用来做初始化工作的;所以初始化工作有哪些;我们首先需要读数据库来初始化当前的数组,这里就是要读取文件的内容,三种情况讨论,文件不存在(直接不合法)文件存在但是为空(直接都初始化空),文件存在且有数据,这个时候我们需要把数据都读出来,C++直接利用fstream就可以; - 有读就有写,当我们职工信息有变化的时候,要同步到文件里,这里定义为save()函数,然后在之后会导致信息变化的函数里加入save函数
- 剩下的就是比较简单的功能实现了,注意查改删操作,都需要用到是否存在逻辑,所以可以封装成isExist()函数,方便复用;
然后改和删会发生变化,所以需要在操作成功后进行同步操作; - 开发的时候采取分离编译,声明写在头文件,实现写在源文件,然后我们保证源文件里只引入头文件即可,源文件需要的其他头文件,都通通放入之前的头文件里;类也是一样,头文件定义类,但是成员只是声明,之后源文件 通过作用域 外部实现;
版本1
官方代码:
- 采取面向对象的方式,进行系统设计,不再是直接裸露的全局函数实现功能;
- 利用指针数组 解决了 数组不能存储不同数据类型的缺陷
- 文件作为简单的数据库,然后利用构造函数 初始化 文件的读取操作;同时封装了save函数,用来系统信息变化后的文件同步
- 命名方式我不太喜欢,函数都改为小驼峰形式;
bug:
- cin输入 类型不匹配 导致程序中断;**[已解决]**
此bug参考通讯录管理系统的bug解决
项目开发文档:职工管理系统
https://vendestine.com/heima-employee-system