当前位置: 首页 > news >正文

(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.lryc.cn/news/408071.html

相关文章:

  • C语言系统调用linux文件系统
  • LeetCode142 环形链表 II
  • 逆向案例二十八——某高考志愿网异步请求头参数加密,以及webpack
  • WebKit的文本装饰艺术:CSS Text Decoration全解析
  • 【linux】Shell脚本三剑客之sed命令的详细用法攻略
  • 解析class字节码文件获取魔数和版本号
  • 技术文档总结----思维导图
  • 【iOS】—— retain\release实现原理和属性关键字
  • 这一文,关于Java泛型的点点滴滴 一
  • 微信小程序之调查问卷
  • 基于Qt的视频剪辑
  • electron 网页TodoList工具打包成win桌面应用exe
  • 数据结构之判断二叉树是否为搜索树(C/C++实现)
  • golang长连接的误用
  • Springboot @Validate @Valid 基于复杂嵌套对象的参数校验示例
  • 算力共享下的,分级路由转发报文协议与通告
  • 滚动数组详解
  • C 语言动态链表
  • 【Leetcode】二十、记忆化搜索:零钱兑换
  • json数据格式 继续学习
  • gradle 构建项目添加版本信息
  • vue3 学习笔记17 -- 基于el-menu封装菜单
  • 使用 Redis 实现验证码、token 的存储,用自定义拦截器完成用户认证、并使用双重拦截器解决 token 刷新的问题
  • 反转链表 - 力扣(LeetCode)C语言
  • 【Linux】进程间通信(1):进程通信概念与匿名管道
  • Spring从入门到精通 01
  • C语言经典习题25
  • 2-47 基于matlab的时域有限差分法(FDTD法)拉夫等效原理进行时谐场外推
  • JupyterNotebook快捷键 自用
  • 【我的OpenGL学习进阶之旅】讲一讲GL_TEXTURE_2D和GL_TEXTURE_EXTERNAL_OES的区别