【C++】基于多态实现员工管理系统

代码
1、主程序:
#include<iostream>
using namespace std;
#include"workerManager.h"#include"worker.h"
#include"employee.h"
#include"manager.h"
#include"boss.h"int main()
{WorkerManager wm;int choice = 0;while (true){wm.Show_Menu();cout << "请输入选择" << endl;cin >> choice;switch (choice){case 0: wm.exitSystem();break;//退出系统case 1: wm.Add_Emp();break;//添加职工case 2: wm.Show_Emp();break;//显示职工case 3: wm.Del_Emp();break;//删除职工case 4: wm.Mod_Emp();break;//修改职工case 5: wm.Find_Emp();break;//查找职工case 6: wm.Sort_Emp();break;//排序职工case 7: wm;break;//清空文件default: system("cls");break;}}system("pause");return 0;
}
以下所有类均需要再头文件中声明函数
2、老板类
#include"boss.h"Boss::Boss(int id, string name, int dId)
{this->m_Id = id;this->m_Name = name;this->m_DeptId = dId;
}void Boss::showInfo()
{cout << "当前职工编号:" << this->m_Id;cout << "\t当前职工姓名:" << this->m_Name;cout << "\t\t当前职工职位:" << this->getDeptName();cout << "\t岗位职责:管理公司所有事务" << endl;
}string Boss::getDeptName()
{return string("总裁");
}
3、经理类
#include"manager.h"Manager::Manager(int id, string name, int dId)
{this->m_Id = id;this->m_Name = name;this->m_DeptId = dId;
}void Manager::showInfo()
{cout << "当前职工编号:" << this->m_Id;cout << "\t当前职工姓名:" << this->m_Name;cout << "\t当前职工职位:" << this->getDeptName();cout << "\t岗位职责:完成老板下发的任务,将任务拆分下发给普通员工" << endl;
}string Manager::getDeptName()
{return string("经理");
}
4、员工类
#include"employee.h"Employee::Employee(int id, string name, int dId)
{this->m_Id = id;this->m_Name = name;this->m_DeptId = dId;
}void Employee::showInfo()
{cout << "当前职工编号:" << this->m_Id;cout << "\t当前职工姓名:" << this->m_Name;cout << "\t当前职工职位:" << this->getDeptName();cout << "\t岗位职责:完成经理下发的任务" << endl;
}string Employee::getDeptName()
{return string("员工");
}
5、函数类
#include "workerManager.h"WorkerManager::WorkerManager()
{ifstream ifs;ifs.open(FILENAME, ios::in);//文件不存在if ( !ifs.is_open() ) {cout << "文件不存在" << endl;this->m_EmpNum = 0;//初始化人数this->m_FileIsEmpty = true;//初始化文件为空标志this->m_EmpArray = NULL;//初始化数组ifs.close();return;}//文件存在但是数据为空char ch;//用输入流对象读取文件中的一个字符if ( (ifs >> ch).eof() ) //如果读文件读到结尾标 则表示文件为空{cout << "文件为空" << endl;this->m_EmpNum = 0;//初始化人数this->m_FileIsEmpty = true;//初始化文件为空标志this->m_EmpArray = NULL;//初始化数组ifs.close();return;}//当文件存在并且有数据时如何初始化int num = this->get_EmpNum();cout << "当前职工人数为:" << num << endl;this->m_EmpNum = num;//开辟空间this->m_EmpArray = new Worker*[this->m_EmpNum];//将文件中的数据存放在数组中this->init_Emp();/*for (int i = 0; i < this->m_EmpNum; i++){cout << "职工编号:" << this->m_EmpArray[i]->m_Id << "  ";cout << "职工姓名:" << this->m_EmpArray[i]->m_Name << "  ";cout << "职工部门:" << this->m_EmpArray[i]->m_DeptId << endl;}*/
}void WorkerManager::Show_Menu()
{cout << " ***********************************" << endl;cout << " ****** 欢迎使用职工管理系统! ******" << endl;cout << " ********   0、退出管理程序 ********" << endl;cout << " ********   1、增加职工信息 ********" << endl;cout << " ********   2、显示职工信息 ********" << endl;cout << " ********   3、删除离职员工 ********" << endl;cout << " ********   4、修改职工信息 ********" << endl;cout << " ********   5、查找职工信息 ********" << endl;cout << " ********   6、按照编号排序 ********" << endl;cout << " ********   7、清空所有文档 ********" << endl;cout << " ***********************************" << endl;cout << endl;
}void WorkerManager::exitSystem()
{cout << "欢迎下次使用该系统" << endl;system("pause");exit(0);//程序退出函数
}void WorkerManager::Add_Emp()
{cout << "请输入增加职工数量:" << endl;int addNum = 0;cin >> addNum;if (addNum > 0){//计算新的空间大小 原来人数+新增人数int newSize = this->m_EmpNum + addNum;//开辟新空间Worker** newSpace = new Worker*[this->m_EmpNum + addNum];//将原空间下内容存放到新空间下if (this->m_EmpArray != NULL){for (int i = 0; i < this->m_EmpNum; i++){newSpace[i] = this->m_EmpArray[i];}}//输入新数据for (int i = 0; i < addNum; i++){int id;string name;int dSelect;cout << "请输入第" << i+1 << "个新员工编号:" << endl;cin >> id;cout << "请输入第" << i + 1 << "个新员工姓名:" << endl;cin >> name;cout << "请选择第" << i + 1 << "个新员工岗位:" << endl;cout << "1、普通职工" << endl;cout << "2、经理" << endl;cout << "3、总裁" << endl;cin >> dSelect;//初始化为空 防止出现野指针//在for循环中只初始化一次 生命周期只有一次Worker* worker = NULL;switch (dSelect){case 1:worker = new Employee(id, name, 1);break;case 2:worker = new Manager(id, name, 2);break;case 3:worker = new Boss(id, name, 3);break;default:break;}//创建了一个足够容纳newSize个worker对象的新数组//newSpace[newSize * sizeof(worker)] = worker;newSpace[this->m_EmpNum+i] = worker;}//释放原有空间delete[] this->m_EmpArray;//更改新空间指向this->m_EmpArray = newSpace;//更新新空间个数this->m_EmpNum = newSize;//标志this->m_FileIsEmpty = false;//提示cout << "成功添加"  << addNum << "名员工" << endl;//成功添加后需要保存到文件中this->save();}else{cout << "输入有误" << endl;}//按任意键后清屏回到上级目录system("pause");system("cls");}void WorkerManager::save()
{ofstream ofs;ofs.open(FILENAME, ios::out);for (int i=0; i < this->m_EmpNum; i++){ofs << this->m_EmpArray[i]->m_Id << "  "<< this->m_EmpArray[i]->m_Name << "  "<< this->m_EmpArray[i]->m_DeptId << endl;}ofs.close();
}int WorkerManager::get_EmpNum()
{ifstream ifs;ifs.open(FILENAME,ios::in);int id;string name;int dId;int num = 0;while (ifs >> id && ifs >> name && ifs >> dId){//记录人数num++;}ifs.close();return num;
}void WorkerManager::init_Emp()
{ifstream ifs;ifs.open(FILENAME,ios::in);int id;string name;int dId;int index = 0;while (ifs >> id && ifs >> name && ifs >> dId){Worker* worker = NULL;//根据不同部门Id创建不同对象if (dId == 1){worker = new Employee(id, name, 1);}else if (dId == 2){worker = new Manager(id, name, 2);}else if (dId == 3){worker = new Boss(id, name, 3);}//存放在数组中this->m_EmpArray[index] = worker;index++;}//关闭文件ifs.close();
}void WorkerManager::Show_Emp()
{if (this->m_FileIsEmpty){cout << "文件不存在或文件内没有数据" << endl;}else{for (int i=0; i < m_EmpNum; i++){//利用多态调用接口this->m_EmpArray[i]->showInfo();}}system("pause");system("cls");
}void WorkerManager::Del_Emp()
{if (this->m_FileIsEmpty){cout << "文件不存在" << endl;}else{//按照职工编号删除cout << "请输入要删除的员工编号:";int num = 0;cin >> num;if (this->IsExist(num) == -1){cout << "不存在该员工" << endl;}else{for (int i = this->IsExist(num); i < this->m_EmpNum-1; i++){this->m_EmpArray[i] = this->m_EmpArray[i + 1];}this->m_EmpNum--; //更新数组中人数//同步更新到文件中this->save();cout << "删除成功" << endl;}}system("pause");system("cls");
}int WorkerManager::IsExist(int id)
{int index = -1;for (int i=0; i < this->m_EmpNum; i++){if (this->m_EmpArray[i]->m_Id == id){index = i;break;}}	return index;
}void WorkerManager::Mod_Emp()
{if (this->m_FileIsEmpty){cout << "文件不存在或文件内容为空" << endl;}else{cout << "当前员工表如下:" << endl;this->Show_Emp();cout << "请输入要修改职工的编号" << endl;int num;cin >> num;if (this->IsExist(num) != -1){delete this->m_EmpArray[this->IsExist(num)];int newid;string newname;int newdid;cout << "当前将" << num << "号员工编号修改为:";cin >> newid;cout << "当前将" << num << "号员工姓名修改为:";cin >> newname;cout << "当前将" << num << "号员工编号职位(1、普通员工 2、经理 3、总裁)为:";cin >> newdid;Worker * worker = NULL;switch (newdid){case 1:worker = new Employee(newid, newname, newdid);break;case 2:worker = new Manager(newid, newname, newdid);break;case 3:worker = new Boss(newid, newname, newdid);break;default:break;}//更改数据到数组中this->m_EmpArray[this->IsExist(num)] = worker;cout << "修改成功" << this->m_EmpArray[this->IsExist(num)]->m_DeptId << endl;this->save();}else{cout << "不存在该员工" << endl;}}system("pause");system("cls");
}void WorkerManager::Find_Emp()
{if (this->m_FileIsEmpty){cout << "文件不存在或文件内容为空" << endl;}else{cout << "请输入要查找的方式:" << endl;cout << "1、按员工编号查找" << endl;cout << "2、按员工姓名查找" << endl;int sel = 0;cin >> sel;if (sel == 1){cout << "请输入要查找的员工编号:" << endl;int num;cin >> num;int ret = IsExist(num);if (ret != -1){cout << "查找成功,信息如下" << endl;this->m_EmpArray[ret]->showInfo();}else{cout << "不存在该员工" << endl;}}else if (sel == 2){cout << "请输入查找的名字" << endl;string name;cin >> name;bool f = false; //查找标志位for (int i=0; i<this->m_EmpNum; i++){if (this->m_EmpArray[i]->m_Name == name ){cout << "查找成功" << this->m_EmpArray[i]->m_Id << "号员工信息如下:" << endl;f = true;this->m_EmpArray[i]->showInfo(); }}if(f == false){cout << "不存在该员工" << endl;;}}else {cout << "输入选择有误" << endl;}	}system("pause");system("cls");
}void WorkerManager::Sort_Emp()
{if (this->m_FileIsEmpty){cout << "文件不存在或文件内容为空" << endl;system("pause");system("cls");}else{cout << "请选择排序方式:" << endl;cout << "1、按员工编号升序" << endl;cout << "2、按员工编号降序" << endl;int sel = 0;cin >> sel;for (int i = 0; i<this->m_EmpNum; i++){int minOrMax = i;for (int j=i+1; j<this->m_EmpNum; j++){if (sel == 1)//升序{if (m_EmpArray[minOrMax]->m_Id > m_EmpArray[j]->m_Id){minOrMax = j;}}else //降序{if (m_EmpArray[minOrMax]->m_Id < m_EmpArray[j]->m_Id){minOrMax = j;}}}if (i != minOrMax){Worker* temp = m_EmpArray[i];m_EmpArray[i] = m_EmpArray[minOrMax];m_EmpArray[minOrMax] = temp;}}cout << "排序完成,排序结果为:" << endl;this->save();this->Show_Emp();}
}void WorkerManager::Clean_File()
{cout << "确认是否清空文件?" << endl;cout << "1、确认" << endl;cout << "2、返回" << endl;int sel = 0;cin >> sel;if (sel == 1){ofstream ofs;ofs.open(FILENAME,ios::trunc);//先删除再创建ofs.close();//将堆区的每一个对象释放感觉if (this->m_EmpArray != NULL){for (int i=0; i<this->m_EmpNum; i++){if (this->m_EmpArray[i] != NULL){delete this->m_EmpArray[i];}}this->m_EmpNum = 0;delete[] this->m_EmpArray;this->m_EmpArray = NULL;this->m_FileIsEmpty = true;}cout << "清空成功" << endl;}system("pause");system("cls");
}WorkerManager::~WorkerManager() //堆区数据手动开辟手动释放
{if (this->m_EmpArray != NULL){delete[] this->m_EmpArray;this->m_EmpArray = NULL;}
}

查漏补缺

1、数组开辟到栈区和堆区的区别

2、worker** 二级指针

worker ** = new worker*[5]

第一个星号是为了找到数组的首地址,第二个星号是为了解开每一个元素的内容【worker*类似int类型】

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/397147.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java语言程序设计——篇十三(1)

&#x1f33f;&#x1f33f;&#x1f33f;跟随博主脚步&#xff0c;从这里开始→博主主页&#x1f33f;&#x1f33f;&#x1f33f; 欢迎大家&#xff1a;这里是我的学习笔记、总结知识的地方&#xff0c;喜欢的话请三连&#xff0c;有问题可以私信&#x1f333;&#x1f333;&…

C#语言基础速成Day07

“知止而后有定&#xff0c;定而后能静&#xff0c;静而后能安&#xff0c;安而后能虑&#xff0c;虑而后能得。” 目录 前言文章有误敬请斧正 不胜感恩&#xff01;||Day07 C#常见数据结构&#xff1a;1. 集合&#xff08;Collection&#xff09;1.1 **List<T>**1.2 **H…

前端(三):Ajax

一、Ajax Asynchronous JavaScript And XML&#xff0c;简称Ajax&#xff0c;是异步的JavaScript和XML。 作用&#xff1a;数据交换&#xff0c;通过Ajax可以给服务器发送请求&#xff0c;并获取服务器响应的数据。异步交互&#xff1a;可以在不重新加载整个页面的情况下&…

本地环境VMware使用代理解决 Docker 镜像拉取问题

引言 本文将分享我在 Windows 10 环境下&#xff0c;通过 VMware 运行的 CentOS 7.8 虚拟机中配置 Docker 代理&#xff0c;成功解决了镜像拉取问题的经验。 问题描述 在尝试启动一个依赖 Docker 的 GitHub 项目时&#xff0c;拉取 Docker 镜像的失败。尝试配置了几个国内源…

Spring Boot优缺点

Spring Boot 是一款用于简化Spring应用开发的框架&#xff0c;它集成了大量常用的框架和工具&#xff0c;大大简化了Spring项目的配置和部署。下面是Spring Boot的优缺点&#xff1a; 优点&#xff1a; 简化配置&#xff1a;Spring Boot自动配置功能可以根据应用的依赖自动配…

Spring Boot - 在Spring Boot中实现灵活的API版本控制(上)

文章目录 为什么需要多版本管理&#xff1f;在Spring Boot中实现多版本API的常用方法1. URL路径中包含版本号2. 请求头中包含版本号3. 自定义注解和拦截器 注意事项 为什么需要多版本管理&#xff1f; API接口的多版本管理在我们日常的开发中很重要&#xff0c;特别是当API需要…

2.mysql数据库-DML-DQL-DCL

1. DML-操作数据 1.1 DML-添加数据 给指定字段添加数据 INSERT INTO 表名 (字段名1&#xff0c;字段名2,…) values (值1,值2…) 给全部字段添加数据 INSERT INTO 表名 values(值1,值2,…) 批量添加数据 INSERT INTO 表名 (字段名1&#xff0c;字段名2,…) values (值1,值2……

Java并发编程实战 读书笔记

目录 1、介绍 2、线程安全 3、共享对象 1、介绍 线程的优点 恰当使用线程&#xff0c;可以提升复杂程序的性能&#xff0c;降低开发和维护成本可以把一部分复杂代码转为直接、简洁易懂的代码更有效地利用空闲处理器资源&#xff0c;提高吞吐量用户界面有更好的响应性线程的…

网络安全 - 应急响应检查表

前言 本项目旨在为应急响应提供全方位辅助&#xff0c;以便快速解决问题。结合自身经验和网络资料&#xff0c;形成检查清单&#xff0c;期待大家提供更多技巧&#xff0c;共同完善本项目。愿大家在应急之路一帆风顺。 图片皆来源于网络&#xff0c;如有侵权请联系删除。 一…

常见框架漏洞 中(IIS6.x、IIS7.x、Apache、Nginx)

目录 中间件 IIS IIS6.x篇 PUT漏洞 漏洞描述 环境 漏洞复现 漏洞复现 工具连接 IIS6.0解析漏洞 IIS短文件漏洞 漏洞描述 原理 复现 短⽂件名特征&#xff1a; ⼯具 IIS RCE-CVE-2017-7269 简介 影响范围 复现 利⽤⼯具 反弹shell Apache 未知扩展名解析…

Oracle【plsql编写九九乘法表】

九九乘法表 DECLAREi NUMBER : 1;j NUMBER : 1; BEGINFOR i IN 1 .. 9LOOPFOR j IN 1 .. iLOOPDBMS_OUTPUT.put (i || * || j || || i * j || );END LOOP;DBMS_OUTPUT.put_line ( );END LOOP; END;输出结果

Vue3从零开始——如何巧妙使用setup语法糖、computed函数和watch函数

文章目录 一、setup语法糖二、computed函数2.1 computed的基本用法2.2 computed vs methods2.3 注意事项 三、watch函数3.1 watch的基本用法3.2 immediate和deep选项 四、综合小Demo五、总结 一、setup语法糖 之前我们在编写代码时每次都要编写setup()​ ,默认导出配置&#x…

浮毛季到了,拒绝猫咪变成“蒲公英”,宠物空气净化器去除浮毛

同为铲屎官&#xff0c;面对家中无处不在的猫毛挑战&#xff0c;想必你也深感头疼。衣物、沙发乃至地毯上的明显猫毛尚可通过吸尘器或粘毛器轻松应对&#xff0c;但那些细微漂浮的毛发却成了难以捉摸的“小恶魔”&#xff0c;普通的空气净化器往往力不从心。对于浮毛&#xff0…

分享安装Windows11系统相关的经验

文章目录 1. 概述2. 安装过程3. 经验分享本章回中我们准备向大家介绍如何安装 Window11操作系统同时分享一些相关的安装经验。 1. 概述 有看官说都什么年代了还介绍如何安装操作系统,不过介绍安装操作系统的方法不是我的重点,我的重点是分享相关的安装经验,帮助大家少走弯…

熵权法模型(评价类问题)

目录 本文章内容参考&#xff1a; 一. 概念 二. 特点 三. 实现步骤 四. 代码实现 本文章内容参考&#xff1a; 熵权法模型讲解(附matlab和python代码) 【数学建模快速入门】数模加油站 江北_哔哩哔哩_bilibili 一. 概念 利用信息熵计算各个指标的权重&#xff0c;从而为…

nvm 切换、安装 Node.js 版本

nvm下载路径 往下拉找到Assets 下载后&#xff0c;找到nvm-setup.exe双击&#xff0c;一直无脑下一步&#xff0c;即可安装成功。 配置环境变量&#xff08;我的是window11&#xff09; 打开任务栏设置–搜环境变量 配置好后&#xff0c;点确定一层一层关闭 windowR 打开控制…

Datawhale X 魔搭 AI夏令营 Task 01

Task 01 1. 注册阿里云 2. 跑通baseline 3. 生成图片并提交 后续思路&#xff1a; 调整prompt&#xff1b;更换微调数据集使用gpt生成故事简介

C++之类与对象(完结撒花篇)

目录 前言 1.再探构造函数 2.类型转换 3.static成员 4. 友元 5.内部类 6.匿名对象 7.对象拷贝时的编译器优化 结束语 前言 在前面的博客中&#xff0c;我们对类的默认成员函数都有了一定了解&#xff0c;同时实现了一个日期类对所学的没内容进行扩展延伸&#xff0c;本…

JavaWeb04-MyBatis与Spring结合

目录 前言 一、MyBatis入门&#xff08;MyBatis官网&#xff09; 1.1 创建mybatis项目&#xff08;使用spring项目整合式方法&#xff09; 1.2 JDBC 1.3 数据库连接池 1.4 实用工具&#xff1a;Lombok 二、MyBatis基础操作 2.1 准备工作 2.2 导入项目并实现操作 2.3 具…

Linux-Haproxy搭建Web群集

LVS在企业应用中抗负载能力强 不支持正则处理&#xff0c;不能实现动静分离对于大型网格&#xff0c;LVS的实施配置复杂&#xff0c;维护成本较高 Haproxy是一款可提供高可用性、负载均衡、及基于TCP和HTTP应用的代理的软件 适用于负载大的Web站点运行在硬件上可支持数以万计的…