这个C++职工管理系统是一个面向初学者的入门级项目,它展示了如何使用面向对象编程(OOP)的核心概念来构建一个实用的控制台应用程序。系统通过文件存储实现数据的持久化,并提供了完整的CRUD(创建、读取、更新、删除)功能。
作为一个教学项目,它特别适合有以下需求的开发者:
提示:这个项目虽然简单,但包含了企业级应用的核心要素。理解它的设计思路后,可以轻松扩展到其他类型的管理系统。
系统的核心是Worker基类和它的三个子类(Employee、Manager、Boss),这种设计体现了OOP的继承特性:
cpp复制class Worker {
public:
virtual void showInfo() = 0; // 纯虚函数
virtual string getDeptName() = 0;
// 公共属性
int m_id;
string m_name;
int deptId;
};
三个子类通过override虚函数实现了多态行为:
cpp复制class Employee : public Worker {
public:
void showInfo() override {
cout << "职工编号: " << m_id
<< "\t岗位: " << getDeptName()
<< "\t职责: 完成经理布置的工作" << endl;
}
string getDeptName() override { return "员工"; }
};
这种设计的主要优势在于:
系统采用文本文件存储数据,设计考虑了几个关键点:
cpp复制ifstream ifs(FILENAME, ios::in);
if (!ifs.is_open()) {
// 文件不存在时的处理
m_employNumber = 0;
m_employArray = nullptr;
m_fileIsEmpty = true;
}
cpp复制worker** m_employArray; // 指向worker指针数组的指针
cpp复制void WorkerManager::save() {
ofstream ofs(FILENAME, ios::out);
for (int i = 0; i < m_employNumber; i++) {
ofs << m_employArray[i]->m_id << " "
<< m_employArray[i]->m_name << " "
<< m_employArray[i]->deptId << endl;
}
ofs.close();
}
添加功能的核心是动态数组的扩容管理:
cpp复制void WorkerManager::addEmployee() {
int addNum = 0;
cout << "请输入添加职工数目: ";
cin >> addNum;
if (addNum > 0) {
int newSize = m_employNumber + addNum;
worker** newSpace = new worker*[newSize];
// 拷贝旧数据
if (m_employArray != nullptr) {
for (int i = 0; i < m_employNumber; i++) {
newSpace[i] = m_employArray[i];
}
}
// 添加新数据
for (int i = 0; i < addNum; i++) {
// 输入验证逻辑...
worker* newWorker = nullptr;
switch(deptId) {
case 1: newWorker = new Employee(id,name,deptId); break;
// 其他case...
}
newSpace[m_employNumber + i] = newWorker;
}
// 释放旧内存
delete[] m_employArray;
m_employArray = newSpace;
m_employNumber = newSize;
}
}
注意事项:动态数组管理必须注意内存释放,避免内存泄漏。每次扩容后要及时释放旧数组内存。
删除操作需要处理两个关键问题:
cpp复制void WorkerManager::deleteEmployee(int id) {
int index = findById(id);
if (index == -1) return;
delete m_employArray[index]; // 释放员工对象
// 移动后续元素
for (int i = index; i < m_employNumber-1; i++) {
m_employArray[i] = m_employArray[i+1];
}
m_employArray[--m_employNumber] = nullptr;
save(); // 更新文件
}
系统提供了升序和降序两种排序方式,基于选择排序算法实现:
cpp复制void WorkerManager::sortEmployees(bool ascending) {
for (int i = 0; i < m_employNumber-1; i++) {
int target = i;
for (int j = i+1; j < m_employNumber; j++) {
bool condition = ascending ?
(m_employArray[j]->m_id < m_employArray[target]->m_id) :
(m_employArray[j]->m_id > m_employArray[target]->m_id);
if (condition) {
target = j;
}
}
if (target != i) {
swap(m_employArray[i], m_employArray[target]);
}
}
}
cpp复制bool isValidName(const string& name) {
// 检查姓名是否只包含字母和空格
return !name.empty() &&
all_of(name.begin(), name.end(), [](char c) {
return isalpha(c) || isspace(c);
});
}
cpp复制vector<worker*> m_employees; // 自动管理内存
cpp复制worker* findEmployee(function<bool(worker*)> predicate) {
auto it = find_if(m_employees.begin(), m_employees.end(), predicate);
return it != m_employees.end() ? *it : nullptr;
}
cpp复制try {
ifstream ifs(FILENAME);
if (!ifs) throw runtime_error("无法打开文件");
// 文件操作...
} catch (const exception& e) {
cerr << "错误: " << e.what() << endl;
}
cpp复制// 写入
worker.serialize(ofstream& ofs);
// 读取
worker.deserialize(ifstream& ifs);
对于想继续提升C++能力的开发者,建议:
这个职工管理系统虽然简单,但涵盖了C++核心概念。通过不断重构和扩展它,可以系统性地提升面向对象设计和C++编程能力。我在实际开发中发现,理解这个项目的每个设计决策,比单纯实现功能更有学习价值。