(7) cmake 编译C++程序(二)

文章目录

    • 概要
    • 整体代码结构
    • 整体代码
    • 小结

概要

在ubuntu下,通过cmake编译一个稍微复杂的管理程序

整体代码结构

在这里插入图片描述

整体代码

boss.cpp

#include "boss.h"Boss::Boss(int id, string name, int dId)
{this->Id = id;this->Name = name;this->DeptId = dId;}void Boss::showInfo()
{cout << "职工编号: " << this->Id<< " \t职工姓名: " << this->Name<< " \t岗位:" << this->getDeptName()<< " \t岗位职责:管理公司所有事务" << endl;
}string Boss::getDeptName()
{return string("总裁");
}

boss.h

#pragma once
#include<iostream>
using namespace std;
#include "worker.h"//老板类
class Boss :public Worker
{
public:Boss(int id, string name, int dId);//显示个人信息virtual void showInfo();//获取职工岗位名称virtual string getDeptName();
};

employee.cpp

#include "employee.h"Employee::Employee(int id, string name, int dId)
{this->Id = id;this->Name = name;this->DeptId = dId;
}void Employee::showInfo()
{cout << "职工编号: " << this->Id<< " \t职工姓名: " << this->Name<< " \t岗位:" << this->getDeptName()<< " \t岗位职责:完成经理交给的任务" << endl;
}string Employee::getDeptName()
{return string("员工");
}

employee.h

#pragma once 
#include<iostream>
using namespace std;
#include "worker.h"//员工类
class Employee :public Worker
{
public://构造函数Employee(int id, string name, int dId);//显示个人信息virtual void showInfo();//获取职工岗位名称virtual string getDeptName();
};

manager.cpp

#include "manager.h"Manager::Manager(int id, string name, int dId)
{this->Id = id;this->Name = name;this->DeptId = dId;}void Manager::showInfo()
{cout << "职工编号: " << this->Id<< " \t职工姓名: " << this->Name<< " \t岗位:" << this->getDeptName()<< " \t岗位职责:完成老板交给的任务,并下发任务给员工" << endl;
}string Manager::getDeptName()
{return string("经理");
}

manager.h

#pragma once
#include<iostream>
using namespace std;
#include "worker.h"//经理类
class Manager :public Worker
{
public:Manager(int id, string name, int dId);//显示个人信息virtual void showInfo();//获取职工岗位名称virtual string getDeptName();
};

worker.h

#pragma once
#include<iostream>
#include<string>
using namespace std;//职工抽象基类
class Worker
{
public://显示个人信息virtual void showInfo() = 0;//获取岗位名称virtual string getDeptName() = 0;int Id; //职工编号string Name; //职工姓名int DeptId; //职工所在部门名称编号
};

workerManager.cpp

#include "workerManager.h"workerManager::workerManager()
{ifstream ifs;ifs.open(FILENAME, ios::in);//文件不存在情况if (!ifs.is_open()){cout << "文件不存在" << endl; //测试输出this->work_num = 0;  //初始化人数this->fileIsEmpty = true; //初始化文件为空标志ifs.close(); //关闭文件return;}char ch;ifs >> ch;if (ifs.eof()){cout << "文件为空!" << endl;this->work_num = 0;this->fileIsEmpty = true;ifs.close();return;}int num =  this->get_Num();this->work_num = num;  //更新成员属性init_Emp(); for (int i = 0; i < this->work_num; i++){cout << "职工号: " << this->works[i]->Id<< " 职工姓名: " << this->works[i]->Name<< " 部门编号: " << this->works[i]->DeptId << endl;}
}workerManager::~workerManager()
{for (vector<Worker *>::iterator it = this->works.begin(); it != this->works.end(); it ++) if (NULL != *it) {delete *it; *it = NULL;}this->works.clear();}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;cin.ignore();cin.get();system("clear");exit(0);
}void workerManager::Add_Emp()
{cout << "请输入增加职工数量: " << endl;int addNum = 0;cin >> addNum;if (addNum > 0){	int new_size = this->work_num + addNum;this->works.reserve(new_size);//输入新数据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 << "请选择该职工的岗位:" << endl;cout << "1、普通职工" << endl;cout << "2、经理" << endl;cout << "3、老板" << endl;cin >> dSelect;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;}this->works.push_back(worker);}this->work_num = new_size;this->fileIsEmpty = false;//提示信息cout << "成功添加" << addNum << "名新职工!" << endl;this->save();}else{cout << "输入有误" << endl;}std::cout << "Press Enter to continue...";cin.ignore();cin.get();system("clear");
}void workerManager::save()
{ofstream ofs;ofs.open(FILENAME, ios::out);for (int i = 0; i < this->work_num; i++){ofs << this->works[i]->Id << " " << this->works[i]->Name << " " << this->works[i]->DeptId << endl;}ofs.close();
}int workerManager::get_Num()
{ifstream ifs;ifs.open(FILENAME, ios::in);string line;int num = 0;while (getline(ifs, line)) { // 逐行读取文件内容if(line.empty()){continue;}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;if (dId == 1)  // 1普通员工{worker = new Employee(id, name, dId);}else if (dId == 2) //2经理{worker = new Manager(id, name, dId);}else //总裁{worker = new Boss(id, name, dId);}// //存放在数组中works.push_back(worker);index++;}
}void workerManager::Show_Emp()
{system("clear");if (this->fileIsEmpty){cout << "文件不存在或记录为空!" << endl;}else{for (int i = 0; i < this->work_num; i++){//利用多态调用接口this->works[i]->showInfo();}}std::cout << "Press Enter to continue...";cin.ignore();cin.get();system("clear");
}int workerManager::IsExist(int id)
{int index = -1;for (int i = 0; i < this->work_num; i++){if (this->works[i]->Id == id){index = i;break;}}return index;
}void workerManager::Del_Emp()
{system("clear");if (this->fileIsEmpty){cout << "文件不存在或记录为空!" << endl;}else{//按职工编号删除cout << "请输入想要删除的职工号:" << endl;int id = 0;cin >> id;int index = this->IsExist(id);if (index != -1)  //说明index上位置数据需要删除{for (int i = index; i < this->work_num - 1; i++){this->works[i] = this->works[i + 1];}this->work_num--;this->save(); //删除后数据同步到文件中cout << "删除成功!" << endl;}else{cout << "删除失败,未找到该职工" << endl;}}std::cout << "Press Enter to continue...";cin.ignore();cin.get();system("clear");
}void workerManager::Mod_Emp()
{if (this->fileIsEmpty){cout << "文件不存在或记录为空!" << endl;}else{cout << "请输入修改职工的编号:" << endl;int id;cin >> id;int ret = this->IsExist(id);if (ret != -1){ //查找到编号的职工int newId = 0;string newName = "";int dSelect = 0;cout << "查到: " << id << "号职工,请输入新职工号: " << endl;cin >> newId;cout << "请输入新姓名: " << endl;cin >> newName;cout << "请输入岗位: " << endl;cout << "1、普通职工" << endl;cout << "2、经理" << endl;cout << "3、老板" << endl;cin >> dSelect;this->works[ret]->Id = newId;this->works[ret]->Name = newName;this->works[ret]->DeptId = dSelect;cout << "修改成功!" << endl;//保存到文件中this->save();}else{cout << "修改失败,查无此人" << endl;}}std::cout << "Press Enter to continue...";cin.ignore();cin.get();system("clear");
}void workerManager::Find_Emp()
{if (this->fileIsEmpty){cout << "文件不存在或记录为空!" << endl;}else{cout << "请输入查找的方式:" << endl;cout << "1、按职工编号查找" << endl;cout << "2、按姓名查找" << endl;int select = 0;cin >> select;if (select == 1) //按职工号查找{int id;cout << "请输入查找的职工编号:" << endl;cin >> id;int ret = IsExist(id);if (ret != -1){cout << "查找成功!该职工信息如下:" << endl;this->works[ret]->showInfo();}else{cout << "查找失败,查无此人" << endl;}}else if(select == 2) //按姓名查找{string name;cout << "请输入查找的姓名:" << endl;cin >> name;bool flag = false;  //查找到的标志for (int i = 0; i < this->work_num; i++){if (works[i]->Name == name){cout << "查找成功,职工编号为:"<< works[i]->Id<< " 号的信息如下:" << endl;flag = true;this->works[i]->showInfo();}}if (flag == false){//查无此人cout << "查找失败,查无此人" << endl;}}else{cout << "输入选项有误" << endl;}}std::cout << "Press Enter to continue...";cin.ignore();cin.get();system("clear");
}void workerManager::Sort_Emp()
{if (this->fileIsEmpty){cout << "文件不存在或记录为空!" << endl;std::cout << "Press Enter to continue...";cin.ignore();cin.get();system("clear");}else{cout << "请选择排序方式: " << endl;cout << "1、按职工号进行升序" << endl;cout << "2、按职工号进行降序" << endl;int select = 0;cin >> select;for (int i = 0; i < this->work_num; i++){int minOrMax = i;for (int j = i + 1; j < this->work_num; j++){if (select == 1) //升序{if (this->works[minOrMax]->Id > this->works[j]->Id){minOrMax = j;}}else  //降序{if (this->works[minOrMax]->Id < this->works[j]->Id){minOrMax = j;}}}if (i != minOrMax){Worker * temp = this->works[i];this->works[i] = this->works[minOrMax];this->works[minOrMax] = temp;}}cout << "排序成功,排序后结果为:" << endl;this->save();this->Show_Emp();}}void workerManager::Clean_File()
{cout << "确认清空?" << endl;cout << "1、确认" << endl;cout << "2、返回" << endl;int select = 0;cin >> select;if (select == 1){//打开模式 ios::trunc 如果存在删除文件并重新创建ofstream ofs(FILENAME, ios::trunc);ofs.close();if (this->works.size() > 0){for (int i = 0; i < this->works.size(); i++){if (this->works[i] != NULL){delete this->works[i];}}this->work_num = 0;this->fileIsEmpty = true;}cout << "清空成功!" << endl;}std::cout << "Press Enter to continue...";cin.ignore();cin.get();system("clear");
}

workerManager.h

#pragma once
#include<iostream>
#include<vector>
#include <fstream>
#include "worker.h"
#include "employee.h"
#include "manager.h"
#include "boss.h"
using namespace std;#define  FILENAME "empFile.txt"class workerManager
{
private:int work_num = 0;bool fileIsEmpty;vector<Worker*> works;public:workerManager();void Show_Menu();int get_Num();void exitSystem();void Add_Emp();void init_Emp();void Show_Emp();void Del_Emp();void Mod_Emp();void Find_Emp();void Sort_Emp();void Clean_File();int IsExist(int id);void save();~workerManager();
};

main.cpp

#include <iostream>
#include <string>
#include <unistd.h>
using namespace std;#include "src/workerManager.h"
#include "src/worker.h"
#include "src/employee.h"
#include "src/manager.h"
#include "src/boss.h"void test()
{Worker * worker = NULL;worker = new Employee(1, "张三", 1);worker->showInfo();delete worker;worker = new Manager(2, "李四", 2);worker->showInfo();delete worker;worker = new Boss(3, "王五", 3);worker->showInfo();delete worker;
}int main(){// test();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.Clean_File();break;default:system("clear");break;}}std::cout << "Press Enter to continue...";cin.ignore();cin.get();system("clear");return 0;}

CMakeLists.txt

cmake_minimum_required(VERSION 2.6) # cmake最低版本
project(manager_project) #项目名称
set(CMAKE_CXX_STANDARD 11) #设置C++编译版本
set(CMAKE_BUILD_TYPE "Debug") # 默认是Release模式,设置为Debug才能调试set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin) #设置可执行文件生产的路径
file(GLOB SOURCES "${PROJECT_SOURCE_DIR}/src/*.cpp")aux_source_directory(. SRC_LISTS) #.下所有的cpp文件打包到变量SRC_LISTS中
add_executable(demo ${SOURCES} ${SRC_LISTS}) #生成可执行文件demo

run.sh

#!/bin/bashmkdir -p build
cd build
cmake ..
make
cd ../bin
./demo

小结

好像还有点小bug没调试,整体应该是能运行

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

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

相关文章

05 HTTP Tomcat Servlet

文章目录 HTTP1、简介2、请求数据格式3、响应数据格式 Tomcat1、简介2、基本使用3、Maven创建Web项目4、IDEA使用Tomcat Servlet1、简介2、方法介绍3、体系结构4、urlPattern配置5、XML配置 HTTP 1、简介 HTTP概念 HyperText Transfer Protocol&#xff0c;超文本传输协议&am…

鸿蒙 动态共享包HSP的创建和引用

1.什么是动态共享包HSP HSP&#xff08;Harmony Shared Package&#xff09;是动态共享包&#xff0c;可以包含代码、C库、资源和配置文件&#xff0c;通过HSP可以实现代码和资源的共享。HSP不支持独立发布&#xff0c;而是跟随其宿主应用的APP包一起发布&#xff0c;与宿主应…

【Django5】模板引擎

系列文章目录 第一章 Django使用的基础知识 第二章 setting.py文件的配置 第三章 路由的定义与使用 第四章 视图的定义与使用 第五章 二进制文件下载响应 第六章 Http请求&HttpRequest请求类 第七章 会话管理&#xff08;Cookies&Session&#xff09; 第八章 文件上传…

redis的学习(三):Java客户端jedis的例子和SpringDataRedis的简介

简介 Java客户端jedis的例子和SpringDataRedis的简介## Java客户端 常用的Java客户端有jedis&#xff0c;lettuce&#xff0c;redission。 优缺点&#xff1a; jedis简单实用&#xff0c;api名是redis的命令&#xff0c;学习成本低。不过jedis实例的线程是不安全的&#xff…

VideoAgent: Long-form Video Understanding with Large Language Model as Agent

VideoAgent: Long-form Video Understanding with Large Language Model as Agent 基本信息 博客贡献人 燕青 作者 Xiaohan Wang, Yuhui Zhang, et al. 标签 Large Language Model Agent, Long-form Video Understanding, Vision-Language Foundation Models 摘要 长视…

Android中systrace配置及注意问题

Android中systrace配置及注意问题 systrace配置的官方文档地址如下&#xff1a;优化启动时间 Systrace systrace 允许在启动期间收集内核和 Android 跟踪记录。systrace 的可视化可以帮助分析启动过程中的具体问题。&#xff08;不过&#xff0c;如果要查看整个启动过程中的平…

2024.7.22 作业

1.将双向链表和循环链表自己实现一遍&#xff0c;至少要实现创建、增、删、改、查、销毁工作 循环链表 looplinklist.h #ifndef LOOPLINKLIST_H #define LOOPLINKLIST_H#include <myhead.h>typedef int datatype;typedef struct Node {union {int len;datatype data;}…

win10开启Linux子系统

打开win10开发人员模式&#xff0c;在设置–>更新和安全–>针对开发人员&#xff0c;中勾选开发人员模式。 然后在控制面板中勾选添加Linux子系统。依次进入控制面板–>程序–>启用或关闭windows功能&#xff0c;勾选适用于windows的linux的子系统&#xff0c;点击…

Mac清理垃圾的软件有哪些 怎么清理电脑上的缓存文件和垃圾清理

如果你发现你的Mac运行速度开始慢如蜗牛&#xff0c;或者硬盘空间快速减少&#xff0c;那么可能是时候使用一款好的清理软件来“洗个澡”了。市场上有许多优秀的Mac清理软件&#xff0c;包括一些出色的国产软件和国际知名软件。那么&#xff0c;mac电脑清理垃圾的软件有哪些&am…

Java---后端文件上传详解

袁门才俊志高远&#xff0c; 震古烁今意决然。 风采翩翩才情显&#xff0c; 雄姿英发立世间。 目录 一&#xff0c;简单案例演示 二&#xff0c;服务器本地存储 三&#xff0c;配置单个文件上传大小限制 一&#xff0c;简单案例演示 首先简单编写一个前端网页&#xff1a; &l…

知识图谱:知识图谱概述(一)

一、知识图谱简介 知识图谱&#xff0c;是结构化的语义知识库&#xff0c;主要用于描述现实世界中的实体及其相互关系&#xff0c;由节点和边组成。节点可以是实体&#xff0c;如汽车、街道等&#xff0c;或是抽象的概念&#xff0c;如AI、疾病等。边可以是实体的属性&#xff…

基于FPGA的以太网设计(2)----以太网的硬件架构(MAC+PHY)

1、概述 以太网的电路架构一般由MAC、PHY、变压器、RJ45和传输介质组成,示意图如下所示: 需要注意的是,上图是一个简化了的模型,它描述的是两台主机之间的直接连接,但在实际应用中基本都是多台主机构成的局域网,它们之间并不直接相连,而是通过交换机Switch来进行…

【PPT把当前页输出为图片】及【PPT导出图片模糊】的解决方法(sci论文图片清晰度)

【PPT把当前页输出为图片】及【PPT导出图片模糊】的解决方法 内容一&#xff1a;ppt把当前页输出为图片&#xff1a;内容二&#xff1a;ppt导出图片模糊的解决方法&#xff1a;方法&#xff1a;步骤1&#xff1a;打开注册表编辑器步骤2&#xff1a;修改注册表&#xff1a; 该文…

万字长文之分库分表里无分库分表键如何查询【后端面试题 | 中间件 | 数据库 | MySQL | 分库分表 | 其他查询】

在很多业务里&#xff0c;分库分表键都是根据主要查询筛选出来的&#xff0c;那么不怎么重要的查询怎么解决呢&#xff1f; 比如电商场景下&#xff0c;订单都是按照买家ID来分库分表的&#xff0c;那么商家该怎么查找订单呢&#xff1f;或是买家找客服&#xff0c;客服要找到对…

深入浅出WebRTC—ULPFEC

FEC 通过在发送端添加额外的冗余信息&#xff0c;使接收端即使在部分数据包丢失的情况下也能恢复原始数据&#xff0c;从而减轻网络丢包的影响。在 WebRTC 中&#xff0c;FEC 主要有两种实现方式&#xff1a;ULPFEC 和 FlexFEC&#xff0c;FlexFEC 是 ULPFEC 的扩展和升级&…

websocket实现进度条

websocket实现进度条 做一个简易的websocket实现进度条的练习&#xff0c;效果如下&#xff1a; 前端vue3 <template><el-progress type"circle" :percentage"this.progressValue" :status"this.perstatus" /><el-button cli…

docker tomcat 404

HTTP 404状态码表示“Not Found”&#xff0c;即服务器无法找到请求的页面。 当用户尝试访问一个不存在的网页时&#xff0c;服务器会返回这个状态码。这个状态码是HTTP协议的一部分&#xff0c;用于告知客户端&#xff08;通常是浏览器&#xff09;服务器无法完成请求。404状…

黑马JavaWeb企业级开发(知识清单)02——HTML实现标题:样式(CSS引入、CSS选择器、span标签)和超链接

文章目录 前言一、标题样式1&#xff1a;新闻标题颜色1. CSS三种引入方式2. 颜色表示3. javacode实现 二、标题样式2&#xff1a;发布时间颜色1. < span >标签2. CSS选择器1&#xff09;元素&#xff08;标签&#xff09;选择器&#xff08;优先级最低&#xff09;2&…

IC秋招RTL代码合集

一 全加器和半加器 全加器 module full_adder1(input Ai, Bi, Ci,output So, Co);assign So Ai ^ Bi ^ Ci ;assign Co (Ai & Bi) | (Ci & (Ai | Bi)); endmodule module full_adder1(input Ai, Bi, Cioutput So, Co);assign {Co, So} Ai Bi Ci ; endm…

wireshark过滤器,如何使用wireshark捕获指定域名的流量

过滤器比较高级&#xff0c;但是也很重要&#xff0c;我决定通过一个案例来学习过滤器的知识点。 比如&#xff0c;我现在访问 zhangdapeng.com 我希望能够捕获关于这个域名下的流量&#xff0c;该如何实现呢&#xff1f; 我选择了捕获以太网的流量&#xff0c;但是目前捕获到…