(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、记忆化搜索 也叫备忘录,即把已经计算过的结果存下来,下次再遇到,就直接取,不用重新计算。目的是以减少重复计算。 以前面提…...
Vue记事本应用实现教程
文章目录 1. 项目介绍2. 开发环境准备3. 设计应用界面4. 创建Vue实例和数据模型5. 实现记事本功能5.1 添加新记事项5.2 删除记事项5.3 清空所有记事 6. 添加样式7. 功能扩展:显示创建时间8. 功能扩展:记事项搜索9. 完整代码10. Vue知识点解析10.1 数据绑…...

使用VSCode开发Django指南
使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架,专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用,其中包含三个使用通用基本模板的页面。在此…...

通过Wrangler CLI在worker中创建数据库和表
官方使用文档:Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后,会在本地和远程创建数据库: npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库: 现在,您的Cloudfla…...
1688商品列表API与其他数据源的对接思路
将1688商品列表API与其他数据源对接时,需结合业务场景设计数据流转链路,重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点: 一、核心对接场景与目标 商品数据同步 场景:将1688商品信息…...
解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错
出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上,所以报错,到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本,cu、torch、cp 的版本一定要对…...

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决
Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决 问题背景 在一个基于 Spring Cloud Gateway WebFlux 构建的微服务项目中,新增了一个本地验证码接口 /code,使用函数式路由(RouterFunction)和 Hutool 的 Circle…...

OPENCV形态学基础之二腐蚀
一.腐蚀的原理 (图1) 数学表达式:dst(x,y) erode(src(x,y)) min(x,y)src(xx,yy) 腐蚀也是图像形态学的基本功能之一,腐蚀跟膨胀属于反向操作,膨胀是把图像图像变大,而腐蚀就是把图像变小。腐蚀后的图像变小变暗淡。 腐蚀…...
Spring AI Chat Memory 实战指南:Local 与 JDBC 存储集成
一个面向 Java 开发者的 Sring-Ai 示例工程项目,该项目是一个 Spring AI 快速入门的样例工程项目,旨在通过一些小的案例展示 Spring AI 框架的核心功能和使用方法。 项目采用模块化设计,每个模块都专注于特定的功能领域,便于学习和…...
在golang中如何将已安装的依赖降级处理,比如:将 go-ansible/v2@v2.2.0 更换为 go-ansible/@v1.1.7
在 Go 项目中降级 go-ansible 从 v2.2.0 到 v1.1.7 具体步骤: 第一步: 修改 go.mod 文件 // 原 v2 版本声明 require github.com/apenella/go-ansible/v2 v2.2.0 替换为: // 改为 v…...

英国云服务器上安装宝塔面板(BT Panel)
在英国云服务器上安装宝塔面板(BT Panel) 是完全可行的,尤其适合需要远程管理Linux服务器、快速部署网站、数据库、FTP、SSL证书等服务的用户。宝塔面板以其可视化操作界面和强大的功能广受国内用户欢迎,虽然官方主要面向中国大陆…...