(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没调试,整体应该是能运行
相关文章:
(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 …...
C语言系统调用linux文件系统
在C语言中,open、write和read函数是系统调用(system calls),它们直接由操作系统提供,用于底层的文件操作。这些函数是UNIX和类UNIX系统(如Linux)中的标准接口,不同于C标准库中的文件…...
LeetCode142 环形链表 II
前言 题目: 142. 环形链表 II 文档: 代码随想录——环形链表 II 编程语言: C 解题状态: 思路错误,链表不允许被修改 思路 两步走,第一步,判断有没有环,第二步,判断入环口…...
逆向案例二十八——某高考志愿网异步请求头参数加密,以及webpack
网址:aHR0cDovL3d3dy54aW5nYW9rYW90Yi5jb20vY29sbGVnZXMvc2VhcmNo 抓包分析,发现请求头有参数u-sign是加密的,载荷没有进行加密,直接跟栈分析。 进入第二个栈,打上断点,分析有没有加密位置。 可以看到参数…...
WebKit的文本装饰艺术:CSS Text Decoration全解析
WebKit的文本装饰艺术:CSS Text Decoration全解析 CSS文本装饰(Text Decoration)是一组用于美化和增强网页文本表现的属性,它们可以为文本添加下划线、上划线、线删除和强调标记等效果。WebKit作为许多现代浏览器的渲染引擎&…...
【linux】Shell脚本三剑客之sed命令的详细用法攻略
✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全…...
解析class字节码文件获取魔数和版本号
写在前面 本文看下如何获取class字节码文件的魔数和版本号信息。 1:正文 需要对class字节码的结构有一定的了解,可以参考这篇文章 。 直接看代码: package org.example;import java.math.BigInteger;public class TTTT {//取部分字节码&…...
技术文档总结----思维导图
性能调优| ProcessOn免费在线作图,在线流程图,在线思维导图 mysql| ProcessOn免费在线作图,在线流程图,在线思维导图 kafka| ProcessOn免费在线作图,在线流程图,在线思维导图 mybatis缓存| ProcessOn免费在线作图,在线流程图,在线思维导图 java锁| ProcessOn免费在线作图,在…...
【iOS】—— retain\release实现原理和属性关键字
【iOS】—— retain\release实现原理和属性关键字 1. retain\reelase实现原理1.1 retain实现原理1.2 release实现原理 2. 属性关键字2.1 属性关键字的分类2.2 内存管理关键字2.2.1 weak2.2.2 assgin2.3.3 strong和copy 2.4 线程安全的关键字2.5 修饰变量的关键字2.5.1常量const…...
这一文,关于Java泛型的点点滴滴 一
作为一个 Java 程序员,用到泛型最多的,我估计应该就是这一行代码: List<String> list new ArrayList<>();这也是所有 Java 程序员的泛型之路开始的地方啊。 不过本文讲泛型,先不从这里开始讲,而是再往前…...
微信小程序之调查问卷
一、设计思路 1、界面 调查问卷又称调查表,是以问题的形式系统地记载调查内容的一种形式。微信小程序制作的调查问卷,可以在短时间内快速收集反馈信息。具体效果如下所示: 2、思路 此调查问卷采用服务器客户端的方式进行设计,服…...
基于Qt的视频剪辑
在Qt中进行视频剪辑可以通过多种方式实现,但通常需要使用一些额外的库来处理视频数据。以下是一些常见的方法和步骤: 使用FFmpeg FFmpeg是一个非常强大的多媒体框架,可以用来处理视频和音频数据。你可以使用FFmpeg的命令行工具或者其库来实现…...
electron 网页TodoList工具打包成win桌面应用exe
参考: electron安装(支持win、mac、linux桌面应用) https://blog.csdn.net/weixin_42357472/article/details/140643624 TodoList工具 https://blog.csdn.net/weixin_42357472/article/details/140618446 electron打包过程: 要将…...
数据结构之判断二叉树是否为搜索树(C/C++实现)
文章目录 判断二叉树是否为搜索树方法一:递归法方法二:中序遍历法总结 二叉树是一种非常常见的数据结构,它在计算机科学中有着广泛的应用。二叉搜索树(Binary Search Tree,简称BST)是二叉树的一种特殊形式&…...
golang长连接的误用
误用一:忘记读取响应的body 由于忘记读取响应的body导致创建大量处于TIME_WAIT状态的连接(同时产生大量处于transport.go的readLoop和writeLoop的协程) 在linux下运行下面的代码: package mainimport ("fmt""html"&qu…...
Springboot @Validate @Valid 基于复杂嵌套对象的参数校验示例
Springboot Validate Valid 基于复杂嵌套对象的参数校验示例 复杂对象 Data public class Object1 {Length(max 50,message "长度不能超过50位字符")NotBlank(message "名称不能为空")private String name;NotNull(message "不能为空")pri…...
算力共享下的,分级路由转发报文协议与通告
目录 网络双 SLA 约束 一、双SLA约束的定义与背景 二、双SLA约束的应用场景 三、双SLA约束的管理与实施 四、双SLA约束的优势与挑战 算力共享下的,分级路由转发报文协议与通告 基础设施即服务(IaaS)类 型算力资源 函数即服务(FaaS)类型算力服务 软件即服务(SaaS…...
滚动数组详解
滚动数组详解 何为滚动数组?滚动数组是如何优化空间的?交替滚动例题:来自某某轮廓线DP的题目 自我滚动(~~不如交替~~ 完结!!! ( 宇宙免责任书:我用的是C) 何为滚动数组? 什么是滚动…...
C 语言动态链表
线性结构->顺序存储->动态链表 一、理论部分 从起源中理解事物,就是从本质上理解事物。 -杜勒鲁奇 动态链表是通过结点(Node)的集合来非连续地存储数据,结点之间通过指针相互连接。 动态链表本身就是一种动态分配内存的…...
【Leetcode】二十、记忆化搜索:零钱兑换
文章目录 1、记忆化搜索2、leetcode509:斐波那契数列3、leetcode322:零钱兑换 1、记忆化搜索 也叫备忘录,即把已经计算过的结果存下来,下次再遇到,就直接取,不用重新计算。目的是以减少重复计算。 以前面提…...
Kubernetes 存储性能优化:从持久卷到存储类
Kubernetes 存储性能优化:从持久卷到存储类 前言 哥们,别整那些花里胡哨的理论。今天直接上硬菜——我在大厂一线优化 Kubernetes 存储性能的真实经验总结。作为一个白天写前端、晚上打鼓的硬核工程师,我对性能的追求就像对鼓点节奏的把控一样…...
基于vue+springboot框架的同城宠物照看数据可视化分析系统的设计与实现
目录技术选型与框架搭建核心功能模块设计开发阶段划分关键代码示例(简化版)测试与部署项目技术支持源码获取详细视频演示 :文章底部获取博主联系方式!同行可合作技术选型与框架搭建 前端:Vue 3 TypeScript ECharts …...
开源视觉模型推荐:GLM-4v-9B,高分辨率输入,中文OCR领先
开源视觉模型推荐:GLM-4v-9B,高分辨率输入,中文OCR领先 1. 引言 在当今多模态AI快速发展的时代,视觉-语言模型正成为技术前沿的热点。GLM-4v-9B作为智谱AI最新开源的90亿参数视觉-语言多模态模型,凭借其11201120高分…...
Cursor最新版0.44.11配置DeepSeek-R1模型保姆级教程(含报错解决方案)
Cursor 0.44.11深度适配DeepSeek-R1模型全流程指南 当技术爱好者第一次在Cursor中尝试调用DeepSeek-R1模型时,往往会遇到各种"水土不服"的情况。就像刚拿到新相机的摄影师需要调整镜头焦距一样,我们需要对Cursor进行精确配置才能充分发挥这个强…...
杭州做生成式引擎优化的服务公司有哪些?
杭州做生成式引擎优化的服务公司有哪些? 一、行业背景:GEO已成为AI时代企业增长的核心基建 生成式引擎优化(GEO,Generative Engine Optimization),是针对大语言模型的检索逻辑与回答规则,优化企…...
手柄优化指南:DS4Windows摇杆调校与硬件适配完全手册
手柄优化指南:DS4Windows摇杆调校与硬件适配完全手册 【免费下载链接】DS4Windows Like those other ds4tools, but sexier 项目地址: https://gitcode.com/gh_mirrors/ds/DS4Windows 在游戏体验中,手柄摇杆的精准控制直接影响操作手感与游戏表现…...
NaViL-9B图文问答入门:Web界面支持拖拽上传+历史记录回溯功能
NaViL-9B图文问答入门:Web界面支持拖拽上传历史记录回溯功能 1. 平台介绍 NaViL-9B是一款原生多模态大语言模型,由专业研究机构开发。它不仅能像传统语言模型一样处理纯文本问答,还具备强大的图片理解能力。这意味着你可以上传一张图片&…...
泛微OA Ecology 安全补丁管理账号配置与实战
1. 泛微OA Ecology安全补丁管理账号配置详解 第一次接触泛微OA Ecology系统的安全补丁管理功能时,我完全没意识到这个看似简单的配置背后藏着这么多门道。直到有次系统被恶意攻击,才发现默认的管理账号存在安全隐患。今天就带大家彻底搞懂这个关键配置&a…...
搭建专属汽车电子测试 AI 助手
专栏:《AI 汽车电子测试实战》第 15 篇 作者:一线汽车电子测试工程师 适合人群:想搭建私有 AI 助手的测试团队、关注数据安全的工程师开篇:为什么需要专属 AI 助手? 这是我上个月在某车企的 AI 部署项目中的真实经历。…...
突破语言边界:XUnity.AutoTranslator全场景应用指南
突破语言边界:XUnity.AutoTranslator全场景应用指南 【免费下载链接】XUnity.AutoTranslator 项目地址: https://gitcode.com/gh_mirrors/xu/XUnity.AutoTranslator 当你打开一款期待已久的外文游戏,却被满屏陌生文字阻挡了探索的脚步࿱…...
