C++封装、继承、多态的应用---职工管理系统

C++封装、继承、多态的应用—职工管理系统

文章目录

  • C++封装、继承、多态的应用---职工管理系统
    • 1.需求分析
    • 2.抽象类的建立
      • 2.1抽象基类
      • 2.2员工类
      • 2.3经理类
      • 2.4老板类
      • 2.5存储类
    • 3.抽象类的实现
    • 4.功能函数的实现
      • 4.1菜单功能的实现
      • 4.2增加职工功能函数实现
      • 4.2显示职工功能函数实现
      • 4.3删除职工功能函数实现
      • 4.4修改信息功能函数实现
      • 4.5查找职工功能函数实现
      • 4.6职工排序功能函数实现
      • 4.7清除信息功能函数实现
    • 5.主函数
    • 6.总结

1.需求分析

可以实现不同职工(老板、经理、员工)的增、删、改、查,以及对员工按职工编号进行排序,同时实现增删改查功能和文件的交互。
在主菜单界面显示:增加职工、显示、删除、修改、查找、排序、清空和退出系统的功能。如下图:
在这里插入图片描述

2.抽象类的建立

2.1抽象基类

class Base {
public:
    int num;
    std::string name;
    std::string job;
    virtual void addPerson(int  &num, std::string &name, std::string &job) = 0;
    virtual void deletePerson(int &num) = 0;
};

基类中定义了老板类、经理类、员工类的共同属性,将增加操作的函数声明为纯虚函数,使基类无法实例化对象,同时需要在派生类中重写基类的纯虚函数,否则派生类也为抽象类,无法实例化对象。

2.2员工类

class Staff : public Base {
public:
    std::string duty = "完成经理交给的任务";
    void addPerson(int &num, std::string &name, std::string &job) override ;
    void deletePerson(int &num) override ;
};

员工类继承基类的属性,同时也拥有自己独一无二的职责属性duty

2.3经理类

class Manager : public Base {
public:
    std::string duty = "完成老板交给的任务,并下发给员工";
    void addPerson(int &num, std::string &name, std::string &job) override ;
    void deletePerson(int &num) override ;
};

2.4老板类

class Boss : public Base {
public:
    std::string duty = "管理公司所有事务";
    void addPerson(int &num, std::string &name, std::string &job) override ;
    void deletePerson(int &num) override ;
};

员工、经理和老板类都继承了基类中共同的属性,同时重写了基类的纯虚函数,使用了继承和多态的技术。

2.5存储类

class SaveList {
public:
    int num{};
    Staff staff[100];
    Manager manager[100];
    Boss boss[100];
};

存储类来实现不同职工信息的存储。

3.抽象类的实现

#include "myClass.h"


void Staff::addPerson(int &num, std::string &name, std::string &job) {
    this->num = num;
    this->name = name;
    this->job = job;
}

void Staff::deletePerson(int &num) {
    num = 0;
}

void Manager::addPerson(int &num, std::string &name, std::string &job) {
    this->num = num;
    this->name = name;
    this->job = job;
}

void Manager::deletePerson(int &num) {
    num = 0;
}

void Boss::addPerson(int &num, std::string &name, std::string &job) {
    this->num = num;
    this->name = name;
    this->job = job;
}
void Boss::deletePerson(int &num) {
    num = 0;
}

通过在头文件中声明类的成员函数,在源文件实现成员函数,提高代码的可读性和易维护性。

4.功能函数的实现

4.1菜单功能的实现

void printMode()
{
    cout << "1.增加职工信息" << endl;
    cout << "2.显示职工信息" << endl;
    cout << "3.删除职工信息" << endl;
    cout << "4.修改职工信息" << endl;
    cout << "5.查找职工信息" << endl;
    cout << "6.排序职工信息" << endl;
    cout << "7.清空职工信息" << endl;
    cout << "0.退出系统" << endl;
    cout << "请选择(0-7): ";
}

通过cout实现简易的菜单界面。

4.2增加职工功能函数实现

void addEmp(SaveList &saveList)
{
    auto *staff = new Staff();
    auto *manager = new Manager();
    auto *boss = new Boss();
    int num = 0;
    string name;
    string job;
    cout << "请输入职工信息:" << endl;
    cout << "请输入职工编号:";
    cin >> num;
    cout << "请输入职工姓名:";
    cin >> name;
    cout << "请输入职工职位:";
    cin >> job;
    if (job == "经理")
    {
        manager->addPerson(num, name, job);
        saveList.manager[saveList.num] = *manager;
        saveList.num++;
        file.open("data.txt", ios::app);
        for (int i = 0; i < saveList.num; i++) {
            if (saveList.manager[i].num != 0) {
                file << saveList.manager[i].num << " " << saveList.manager[i].name << " " << saveList.manager[i].job
                    << " " << saveList.manager[i].duty << endl;
            }
        }
        file.close();
    }
    else if (job == "老板")
    {
        boss->addPerson(num, name, job);
        saveList.boss[saveList.num] = *boss;
        saveList.num++;
        file.open("data.txt", ios::app);
        for (int i = 0; i < saveList.num; i++) {
            if (saveList.boss[i].num != 0) {
                file << saveList.boss[i].num << " " << saveList.boss[i].name << " " << saveList.boss[i].job
                        << " " << saveList.boss[i].duty << endl;
            }
        }
        file.close();
    }
    else if (job == "员工")
    {
        staff->addPerson(num, name, job);
        saveList.staff[saveList.num] = *staff;
        saveList.num++;
        file.open("data.txt", ios::app);
        for (int i = 0; i < saveList.num; i++)
        {
            if (saveList.staff[i].num != 0){
                file << saveList.staff[i].num << " " << saveList.staff[i].name << " " << saveList.staff[i].job  << " " << saveList.staff[i].duty << endl;
            }
        }
        file.close();
    }
}

增加职工通过调用不同类的成员函数,增加不同岗位的职工,同时将不同岗位的职工数据存入各自的存储数组中,同时打开文件,将写文件方式设置为app(追加模式)解决每次写文件时对上次内容覆盖的问题。

4.2显示职工功能函数实现

void showEmp(SaveList &saveList)
{
    if (saveList.num == 0)
    {
        cout << "没有职工信息" << endl;
    }
    else
    {
        for (int i = 0; i < saveList.num; i++)
        {
            if (saveList.manager[i].num != 0){
                cout << "职工编号:" << saveList.manager[i].num << "\t\t";
                cout << "职工姓名:" << saveList.manager[i].name << "\t\t";
                cout << "职工职位:" << saveList.manager[i].job << "\t\t";
                cout << "职工职责:" << saveList.manager[i].duty << endl;
            }
        }
        for (int i = 0; i < saveList.num; i++)
        {
            if (saveList.boss[i].num != 0){
                cout << "职工编号:" << saveList.boss[i].num << "\t\t";
                cout << "职工姓名:" << saveList.boss[i].name << "\t\t";
                cout << "职工职位:" << saveList.boss[i].job << "\t\t";
                cout << "职工职责:" << saveList.boss[i].duty << endl;
            }
        }
        for (int i = 0; i < saveList.num; i++)
        {
            if (saveList.staff[i].num != 0){
                cout << "职工编号:" << saveList.staff[i].num << "\t\t";
                cout << "职工姓名:" << saveList.staff[i].name << "\t\t";
                cout << "职工职位:" << saveList.staff[i].job << "\t\t";
                cout << "职工职责:" << saveList.staff[i].duty << endl;
            }
        }
    }
}

对不同存储数组进行遍历,将内容输出。

4.3删除职工功能函数实现

void deleteEmp(SaveList &saveList)
{
    if (saveList.num == 0)
    {
        cout << "没有职工信息" << endl;
    }
    else
    {
        int num;
        cout << "请输入要删除的职工编号:";
        cin >> num;
        for (int i = 0; i < saveList.num; i++)
        {
            if (saveList.manager[i].num == num)
            {
                saveList.manager[i].num = 0;
                saveList.manager[i].name = "";
                saveList.num--;
            }
            if (saveList.boss[i].num == num)
            {
                saveList.boss[i].num = 0;
                saveList.boss[i].name = "";
                saveList.num--;
            }
            if (saveList.staff[i].num == num)
            {
                saveList.staff[i].num = 0;
                saveList.staff[i].name = "";
                saveList.num--;
            }
        }
    }
}

从显示函数部分知道,遍历每个数组时,会剔除编号为0的职工信息,故只需将职工的编号置为0实现这部分职工不显示,从侧面实现职工删除。

4.4修改信息功能函数实现

void modifyEmp(SaveList &saveList)
{
    auto *boss = new Boss();
    auto *staff = new Staff();
    auto *manager = new Manager();
    if (saveList.num == 0)
    {
        cout << "没有职工信息" << endl;
    }
    else
    {
        int num;
        cout << "请输入要修改的职工编号:";
        cin >> num;
        for (int i = 0; i < saveList.num; i++)
        {
            if (saveList.manager[i].num == num)
            {
                cout << "请输入职工姓名:";
                cin >> saveList.manager[i].name;
                cout << "请输入职工职位:";
                cin >> saveList.manager[i].job;
                if (saveList.manager[i].job == "老板"){
                    num = saveList.manager[i].num;
                    boss->addPerson(num, saveList.manager[i].name, saveList.manager[i].job);
                    saveList.boss[saveList.num] = *boss;
                    saveList.manager[i].num = 0;
                    saveList.num++;
                    return;
                }
                if (saveList.manager[i].job == "员工"){
                    staff->addPerson(num, saveList.manager[i].name, saveList.manager[i].job);
                    saveList.staff[saveList.num] = *staff;
                    saveList.manager[i].num = 0;
                    saveList.num++;
                    return;
                }
            }
            if (saveList.boss[i].num == num)
            {
                cout << "请输入职工姓名:";
                cin >> saveList.boss[i].name;
                cout << "请输入职工职位:";
                cin >> saveList.boss[i].job;
                if (saveList.boss[i].job == "经理"){
                    manager->addPerson(num, saveList.boss[i].name, saveList.boss[i].job);
                    saveList.manager[saveList.num] = *manager;
                    saveList.num++;
                    return;
                }
                if (saveList.boss[i].job == "员工"){
                    staff->addPerson(num, saveList.boss[i].name, saveList.boss[i].job);
                    saveList.staff[saveList.num] = *staff;
                    saveList.num++;
                    return;
                }
            }
            if (saveList.staff[i].num == num)
            {
                cout << "请输入职工姓名:";
                cin >> saveList.staff[i].name;
                cout << "请输入职工职位:";
                cin >> saveList.staff[i].job;
                if (saveList.staff[i].job == "经理"){
                    manager->addPerson(num, saveList.staff[i].name, saveList.staff[i].job);
                    saveList.manager[saveList.num]= *manager;
                    saveList.num++;
                    return;
                }
                if (saveList.staff[i].job == "老板"){
                    boss->addPerson(num, saveList.staff[i].name, saveList.staff[i].job);
                    saveList.boss[saveList.num] = *boss;
                    saveList.num++;
                    return;
                }
            }
        }
    }
}

在修改信息的过程中,如果修改的内容不包括岗位时,只需要对原始数据进行覆盖操作,但修改岗位时,事实上此时应该将数据更改存储位置,以保证默认值duty可以正确输出,所以可以认为修改岗位时相当于为其他岗位增加了一个成员,使本岗位减少了一个成员。

4.5查找职工功能函数实现

void findEmp(SaveList &saveList)
{
    if (saveList.num == 0)
    {
        cout << "没有职工信息" << endl;
    }
    else
    {
        int num;
        cout << "请输入要查找的职工编号:";
        cin >> num;
        for (int i = 0; i < saveList.num; i++)
        {
            if (saveList.manager[i].num == num)
            {
                cout << "职工编号:" << saveList.manager[i].num << "\t\t";
                cout << "职工姓名:" << saveList.manager[i].name << "\t\t";
                cout << "职工职位:" << saveList.manager[i].job << "\t\t";
                cout << "职工职责:" << saveList.manager[i].duty << endl;
            }
            if (saveList.boss[i].num == num)
            {
                cout << "职工编号:" << saveList.boss[i].num << "\t\t";
                cout << "职工姓名:" << saveList.boss[i].name << "\t\t";
                cout << "职工职位:" << saveList.boss[i].job << "\t\t";
                cout << "职工职责:" << saveList.boss[i].duty << endl;
            }
            if (saveList.staff[i].num == num)
            {
                cout << "职工编号:" << saveList.staff[i].num << "\t\t";
                cout << "职工姓名:" << saveList.staff[i].name << "\t\t";
                cout << "职工职位:" << saveList.staff[i].job << "\t\t";
                cout << "职工职责:" << saveList.staff[i].duty << endl;
            }
        }
    }
}

通过遍历每个存储数组,将存储内容输出。

4.6职工排序功能函数实现

void sortEmp(SaveList &saveList)
{
    if (saveList.num == 0)
    {
        cout << "没有职工信息" << endl;
    }
    else
    {
        for (int i = 0; i < saveList.num; i++)
        {
            for (int j = 0; j < saveList.num - i - 1; j++)
            {
                if (saveList.manager[j].num > saveList.manager[j + 1].num)
                {
                    swap(saveList.manager[j], saveList.manager[j + 1]);
                }
                if (saveList.boss[j].num > saveList.boss[j + 1].num)
                {
                    swap(saveList.boss[j], saveList.boss[j + 1]);
                }
                if (saveList.staff[j].num > saveList.staff[j + 1].num)
                {
                    swap(saveList.staff[j], saveList.staff[j + 1]);
                }
            }
        }
    }
}

通过冒泡排序将职工按编号进行升序排列(编号小的先显示)。

4.7清除信息功能函数实现

void deleteAll(SaveList &saveList)
{
    if (saveList.num == 0)
    {
        cout << "没有职工信息" << endl;
    }
    else
    {
        for (int i = 0; i < saveList.num; i++)
        {
            saveList.manager[i].num = 0;
            saveList.boss[i].num = 0;
            saveList.staff[i].num = 0;
        }
        saveList.num = 0;
        file.open("data.txt", ios::out);
        file << " " << endl;
        file.close();
    }
}

参考删除职工的操作,将所有信息“清除”,同时以普通模式向文件中写入空格,覆盖原来的信息。

5.主函数

#include <iostream>
#include "myFunc.h"
#include "myClass.h"
using namespace std;

int mode = 1;
string str;

int main() {
    SaveList saveList;
    while (mode != 0){
        printMode();
        cin >> mode;
        switch (mode) {
            case 1:
                label:
                addEmp(saveList);
                cout << "是否继续添加:"
                     << "1.继续添加"
                     << "2.退出" << endl;
                cin >> str;
                if (str == "2") {
                    break;
                }
                if (str == "1"){
                    goto label;
                }
            case 2:
                label2:
                showEmp(saveList);
                cout << "是否继续查看:"
                     << "1.继续查看"
                     << "2.退出" << endl;
                cin >> str;
                if (str == "2") {
                    break;
                }
                if (str == "1"){
                    goto label2;
                }
            case 3:
                label3:
                deleteEmp(saveList);
                cout << "是否继续删除:"
                     << "1.继续删除"
                     << "2.退出" << endl;
                cin >> str;
                if (str == "2") {
                    break;
                }
                if (str == "1"){
                    goto label3;
                }
            case 4:
                label4:
                modifyEmp(saveList);
                cout << "是否继续修改:"
                     << "1.继续修改"
                     << "2.退出" << endl;
                cin >> str;
                if (str == "2") {
                    break;
                }
                if (str == "1"){
                    goto label4;
                }
            case 5:
                label5:
                findEmp(saveList);
                cout << "是否继续查找:"
                     << "1.继续查找"
                     << "2.退出" << endl;
                cin >> str;
                if (str == "2") {
                    break;
                }
                if (str == "1"){
                    goto label5;
                }
            case 6:
                sortEmp(saveList);
                cout << "排序成功" << endl;
                break;
            case 7:
                cout << "确定删除所有员工?:";
                cin >> str;
                if (str == "是"){
                    deleteAll(saveList);
                    cout << "删除成功" << endl;
                    break;
                }
            default:
                cout << "欢迎使用" << endl;
        }
    }
    return 0;
}

通过switch实现不同功能函数的调用,同时引入goto语句,实现对同一个功能函数的重复调用。

6.总结

通过这个简单的案例,可以加深对基础语法的理解,以及夯实基础知识,为学习更加复杂的知识打下基础。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

初中英语优秀作文分析-005How to Plan Our Life Wisely-如何明智地规划我们的生活

PDF格式公众号回复关键字:SHCZYF005 记忆树 1 The “double reduction policy” reduces the burden on students and offers us more spare time than before, but how to plan our life wisely? 翻译 “双减政策”减轻了学生的负担&#xff0c;给了我们比以前更多的业余…

DVWA-XSS(Stored)-beef

用Low Level来测试beef的使用 beef配置 如果kali没有beef的&#xff0c;进行下载 apt install beef-xss使用 beef-xss # 命令方式启动 beef-xss-stop # 命令方式关闭 systemctl start beef-xss.service #开启beefsystemctl stop beef-xss.service #关闭…

充电学习—1、psy框架梳理

一、linux充电驱动代码框架&#xff1a; APP 层 该部分属于电量上报的最后的环节。其主要工作是&#xff1a;监听系统广播并对 UI 作出相应更新&#xff0c;包括电池电量百分比&#xff0c;充电状态&#xff0c;低电提醒&#xff0c;led 指示灯&#xff0c;异常提醒等FrameWork…

【pytorch06】 维度变换

常用API view/reshapesqueeze/unsqueezetranspose/t/permuteexpand/repeat view和reshape view操作的基本前提是保证numel()一致 a.view(4,28*28)的物理意义是把行宽以及通道合并在一起&#xff0c;对于4张图片&#xff0c;我们直接把所有数据都合在一起&#xff0c;用一个7…

详解 Macvlan 创建不同容器独立跑仿真(持续更新中)

一、概念介绍 1.1 什么是macvlan macvlan是一种网卡虚拟化技术&#xff0c;能够将一张网卡&#xff08;Network Interface Card, NIC&#xff09;虚拟出多张网卡&#xff0c;这意味着每个虚拟网卡都能拥有独立的MAC地址和IP地址&#xff0c;从而在系统层面表现为完全独立的网络…

MySQL命名规范(自用)

MtySQL命名规范 基本通用规范 1.【推荐】关键字必须大写 所有关键字必须大写&#xff0c;如&#xff1a;INSERT、UPDATE、DELETE、SELECT及其子句&#xff0c;IF……ELSE、CASE、DECLARE等 2.【强制】字段和建表必须写备注 COMMENT写备注 3.【强制】字母数字下划线 采用26个英…

AIGC系列之一-一文理解什么是Embedding嵌入技术

摘要&#xff1a;嵌入技术&#xff08;Embedding&#xff09;是一种将高维数据映射到低维空间的技术&#xff0c;在人工智能与图形学研究中被广泛应用。本文将介绍嵌入技术的基本概念、原理以及在 AIGC&#xff08;Artificial Intelligence and Graphics Computing&#xff09;…

PAL: Program-aided Language Models

PAL: Program-aided Language Models ArXiv&#xff1a;https://arxiv.org/pdf/2211.10435 GitHub&#xff1a;https://reasonwithpal.com/ 一、动机 大模型与Chain-of-Thought可以很好地将一些复杂的问题分解为若干个子问题并进行逐步推理&#xff1b;但是对于一些较为复杂…

个人成长的利器:复盘教你如何避免重蹈覆辙

前言 &#x1f4eb; 大家好&#xff0c;我是南木元元&#xff0c;热爱技术和分享&#xff0c;欢迎大家交流&#xff0c;一起学习进步&#xff01; &#x1f345; 个人主页&#xff1a;南木元元 最近忙着学习和工作&#xff0c;更新比较少&#xff0c;期间一直在思考如何才能快速…

区块链技术原理

1.起源&#xff1a; ➢ 中本聪(Satoshi Nakamoto), 2008 ➢ 比特币:一种点对点的电子现金系统 2.分布式账本技术原理 ➢ 将交易向全网所有节点进行广播 ➢ 众多记账节点对记账权达成共识&#xff0c;由共识确认的记账节点把记账区块发布给全网 ➢ 所有账本数据完整存储于区块…

【Linux】进程间通信_1

文章目录 七、进程间通信1. 进程间通信分类管道 未完待续 七、进程间通信 进程间由于 进程具有独立性 &#xff0c;所以不可以直接进行数据传递。但是我们通常需要多个进程协同&#xff0c;共同完成一件事&#xff0c;所以我们需要进程间通信的手段。进程间通信的本质就是先让…

AI 开发平台(Coze)搭建小游戏《挑战花光10亿》

前言 本文讲解如何从零开始&#xff0c;使用扣子平台去搭建一个小游戏 这是成品链接&#xff1a;挑战花光10亿 - 扣子 AI Bot (coze.cn) 欢迎大家去体验一下 效果 正文 什么是coze平台&#xff1f; 扣子&#xff08;Coze&#xff09;是字节跳动推出的一站式 AI 开发平台&am…

osi七层参考模型和tcp/ip模型的区别与相似之处

osi七层参考模型&#xff1a; 2.tcp/ip四层参考模型&#xff1a; osi七层参考模型与tcp/ip四层参考模型的相似与区别&#xff1a; 相同点&#xff1a; 2者都是模型化层次化 下层对上层提供服务支持 每层协议彼此相互独立 不同点&#xff1a;OSI先有模型才有协议 TCP/IP先有…

DS:二叉树的链式存储及遍历

​ 欢迎来到Harper.Lee的学习世界&#xff01; 博主主页传送门&#xff1a;Harper.Lee的博客主页 想要一起进步的uu可以来后台找我哦&#xff01; ​ 一、引入 1.1 二叉树的存储方式 在之前接触到的满二叉树和完全二叉树使用的是数组的存储方式&#xff08;DS&#xff1a;树与…

Python编程技巧:如何正确使用with语句(Python中with用法详解)

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 文章内容 📒📝 基本语法📝 处理文件📝 处理网络连接📝 管理线程锁📝 管理数据库连接📝 管理临时目录和文件📝 使用上下文装饰器📝 自定义上下文管理器🎯 示例1🎯 示例2📝 使用多个上下文管理器📝 上下…

Web渗透:文件上传-后端过滤

在上一篇文件上传的内容中笔者阐述了文件上传漏洞产生的相关原理以及使用了一个pikachu靶场的例子进行演示&#xff0c;在这个例子中涉及到了前端代码对于文件上传漏洞的相关防护&#xff0c;以及站在攻击者的角度我们要如何绕过前端的防护成功进行攻击&#xff1b;但是事实上对…

【ACM出版】2024人工智能与自然语言处理国际学术会议(AINLP 2024,7月19-21)

2024人工智能与自然语言处理国际学术会议&#xff08;AINLP 2024&#xff09;将于2024年7月19-21日在中国珠海召开&#xff0c;该会议作为第四届人工智能、自动化与高性能计算国际会议&#xff08;AIAHPC 2024&#xff09;分会场召开。 本次会议主要围绕“人工智能与自然语言处…

pycharm的一些配置

1.安装 2.字体 3.新建文件模版 4.快捷键设置

【会议征稿,CPS出版】第四届管理科学和软件工程国际学术会议(ICMSSE 2024,7月19-21)

第四届管理科学和软件工程国际学术会议(ICMSSE 2024)由ACM珠海分会&#xff0c;广州番禺职业技术学院主办&#xff1b;全国区块链行业产教融合共同体&#xff0c;AEIC学术交流中心承办&#xff0c;将于2024年7月19-21日于广州召开。 会议旨在为从事管理与软件工程领域的专家学…

[Qt] Qt Creator中配置 Vs-Code 编码风格

新建vscode-onedark.xml文档 &#xff0c;将如下内容复制进去&#xff0c;并配置到Creator中&#xff1a; <?xml version"1.0" encoding"UTF-8"?> <style-scheme version"1.0" name"One Dark"><style name"Tex…