总结遇到最多的问题,这个坑真大

《C++》员工管理系统(完成)_#include


<Ems.h>

#define once
#include <iostream>
#include <fstream>
#include <string>
#include "worker.h"
using namespace std;

#define SIZE_MAX 3

class LinkClass
{
public:
		Worker *wp;
		LinkClass *next;
};

class WorkerManager
{
public:
	WorkerManager(LinkClass *L);
	~WorkerManager();

	int M_no;
	int M_duty;
	string M_name;

	LinkClass *LinkList;
	int M_size;

	void DeleteLink(LinkClass *L);
	//显示菜单
	void ShowMenu();
	//添加
	bool Ems_Add(LinkClass *L);
	//删除
	bool Ems_Delete(LinkClass *L);
	//修改
	bool Ems_Edit(LinkClass *L);
	//查找
	bool Ems_Find(LinkClass *L);
	//本地存储
	bool Ems_Write(const LinkClass *L);
	//本地读取
	bool Ems_Read(LinkClass *L, WorkerManager *pw);
	//打印Link
	void Ems_Show(const LinkClass *L);
	//
	void Ems_DeleteAll(LinkClass *L);
};

void InfoLink(LinkClass *p, WorkerManager *pw);

<worker.h>

#define _CRT_SECURE_NO_WARNINGS 1
#include <iostream>
#include <string>
using namespace std;

//职工类
class Worker
{
public:
	//显示个人信息
	virtual void  showInfo() = 0;
	//获取岗位
	virtual string getDeptName() = 0;

	int M_Id;//编号
	int M_Duty;//部门编号
	string M_Name;//姓名
};


//老板
class Boss : public Worker
{
public:
	//构造
	Boss(int id,int duty,string name);
	//显示个人信息
	void showInfo();
	//获取岗位
	string getDeptName();
};

//经理
class Manager : public Worker
{
public:
	//构造
	Manager(int id, int duty, string name);
	//显示个人信息
	void showInfo();
	//获取岗位
	string getDeptName();
};

//员工
class FlWorker : public Worker
{
public:
	//构造
	FlWorker(int id, int duty, string name);
	//显示个人信息
	void showInfo();
	//获取岗位
	string getDeptName();
};

<Ems.cpp>

#define _CRT_SECURE_NO_WARNINGS 1
#include "Ems.h"

void InfoLink(LinkClass *p, WorkerManager *pw)
{
	p->wp = NULL;
	p->next = NULL;
	pw->Ems_Read(p, pw);
}

void WorkerManager::DeleteLink(LinkClass *L)
{
	LinkClass *p = L->next;
	while (p)
	{
		LinkClass *cur = p->next;
		delete p->wp;
		delete p;
		p = cur;
		this->M_size--;
	}
}

	bool WorkerManager::Ems_Write(const LinkClass *L)
	{
		bool flag = true;
		LinkClass *p = L->next;
		ofstream ofs;
		ofs.open("Ems.dat", ios::out | ios::binary | ios::trunc);
		if (!(ofs.is_open()))
			return false;
		while (p)
		{
			ofs.write((char*)p->wp, sizeof(Worker));
			p = p->next;
			flag = false;
		}
		if (flag)
			ofs << "";
		ofs.close();
		return true;
	}
	bool WorkerManager::Ems_Read(LinkClass *L, WorkerManager *pw)
	{
		LinkClass *p = L;
		ifstream ifs;
		char c;
		ifs.open("Ems.dat", ios::in | ios::binary);
		if (!ifs.is_open())
			return false;
		if (!(ifs >> c))
			return false;
		ifs.seekg(0);
		L->wp = new Boss(1, 1, "1");
		while (ifs.read((char*)L->wp, sizeof(Worker)))
		{
			LinkClass *s = new LinkClass;
			int id = L->wp->M_Id;
			int duty = L->wp->M_Duty;
			string name = L->wp->M_Name;
			switch (duty)
			{
			case 1:
				s->wp = new Boss(id, duty, name);
				break;
			case 2:
				s->wp = new Manager(id, duty, name);
				break;
			case 3:
				s->wp = new FlWorker(id, duty, name);
				break;
			default:
				break;
			}
			s->next = NULL;
			p->next = s;
			p = p->next;
			pw->M_size++;
		}
		ifs.close();
		return true;
	}
	void WorkerManager::ShowMenu()
	{
		cout << "************** 职  工 管  理  系  统 ***************" << endl;
		cout << "*****    W e l  c o m e      G u M u 2 0 2 3   *****" << endl;
		cout << "**************** 0 退出管理程序 **************" << endl;
		cout << "**************** 1 添加职工信息 **************" << endl;
		cout << "**************** 2 删除离职职工 **************" << endl;
		cout << "**************** 3 修改职工信息 **************" << endl;
		cout << "**************** 4 查找职工信息 **************" << endl;
		cout << "**************** 5 显示职工信息 **************" << endl;
		cout << "**************** 6 删除所有信息 **************" << endl;
	}
	WorkerManager::WorkerManager(LinkClass *L)
	{
		this->M_size = 0;
		this->LinkList = L;
	}

	WorkerManager::~WorkerManager()
	{
		this->DeleteLink(LinkList);
		cout << "Link已释放" << endl;
	}


	//增
	bool WorkerManager::Ems_Add(LinkClass *L)
	{
		int id = 0;
		int duty = 0;
		string name;
		while (true)
		{
			LinkClass *p = L;
			LinkClass *cur = p->next;
			bool flag = true;
			cout << "\t(提示:输入 -1 退出到菜单)" << endl;
			cout << "[当前状态] <添加>  请输入工号:>";
			cin >> id;
			if (-1 == id)
				break;
			while (cur)
			{
				if (cur->wp->M_Id == id)
				{
					cout << "\t工号已被使用!" << endl;
					return false;
				}
				p = cur;
				cur = cur->next;
			}
			LinkClass *s = NULL;
			s = new LinkClass;

			cout << "\t1  BOSS" << endl;
			cout << "\t2  经理" << endl;
			cout << "\t3  员工" << endl;
			do
			{
				flag = true;
				cout << "[当前状态] <添加>  请选择职位:>";
				cin >> duty;
				cin.clear(); cin.ignore();
				switch (duty)
				{
				case 1:
					cout << "[当前状态] <添加>  请输入姓名:>";
					cin >> name;
					s->wp = new Boss(id, duty, name);
					break;
				case 2:
					cout << "[当前状态] <添加>  请输入姓名:>";
					cin >> name;
					s->wp = new Manager(id, duty, name);
					break;
				case 3:
					cout << "[当前状态] <添加>  请输入姓名:>";
					cin >> name;
					s->wp = new FlWorker(id, duty, name);
					break;
				default:
					cout << "[当前状态] <添加>  职位选项无效,添加失败!" << endl;
					flag = false;
					break;
				}
			} while (!flag);
			if (!s->wp)
				return false;
			s->next = NULL;
			p->next = s;
			this->M_size++;
			p = p->next;
			cout << "[当前状态] <添加>  添加成功,继续添加!" << endl;
		}
		return true;
	}
	//删
	bool WorkerManager::Ems_Delete(LinkClass *L)
	{
		LinkClass *p = L;
		int id = 0;
		bool flag = false;
		cout << "[当前状态] <删除>  请输入工号:>";
		cin >> id;
		while (p->next)
		{
			if (p->next->wp->M_Id == id)
			{
				LinkClass *tmp = p->next;
				if (!p->next->next)
					p->next = NULL;
				else
					p->next = p->next->next;
				delete tmp;
				this->M_size--;
				cout << "[当前状态] <删除>  删除成功!" << endl;
				flag = true;
			}
			p = p->next;
		}
		if (!flag)
		{
			cout << "[当前状态] <删除>  删除失败,工号不存在!" << endl;
			return false;
		}
		return true;
	}
	//改
	bool WorkerManager::Ems_Edit(LinkClass *L)
	{
		LinkClass *p = L;
		int id = 0;
		bool flag = false;
		cout << "(输入 -1 跳过修改项)" << endl;
		cout << "[当前状态] <修改>  输入要修改人的工号:>";
		cin >> id;
		while (p)
		{
			if (p->wp->M_Id == id)
			{
				int duty = 0;
				string name;
				LinkClass *tmp = L;
				bool repaet = false;
				cout << "[当前状态] <修改>  请输入修改后工号:>";
				cin >> id;
				if (!(-1 == id))
				{
					while (tmp)
					{
						if (tmp->wp->M_Id == id)
						{
							cout << "\t工号已被使用!";
							repaet = true;
							break;
						}
						tmp = tmp->next;
					}
					if (repaet)
						continue;
					p->wp->M_Id = id;
				}
				cout << "\t1  BOSS" << endl;
				cout << "\t2  经理" << endl;
				cout << "\t3  员工" << endl;
				do
				{
					cout << "[当前状态] <修改>  请选择修改后职位:>";
					cin >> duty;
					cin.clear(); cin.ignore();
					if (1 == duty || 2 == duty || 3 == duty)
					{
						p->wp->M_Duty = duty;
						cout << "[当前状态] <修改>  请输入修改后姓名:>";
						cin >> name;
						flag = true;
					}
					else if (-1 == duty)
					{
						cout << "[当前状态] <修改>  请输入修改后姓名:>";
						cin >> name;
						flag = true;
					}
					else
						cout << "[当前状态] <修改>  职位选项无效,修改失败!";
				} while (!flag);
				flag = true;
				break;
			}
			p = p->next;
		}
		if (!flag)
		{
			cout << "[当前状态] <修改>  工号不存在!" << endl;
			return false;
		}
		return true;
	}
	//查
	bool WorkerManager::Ems_Find(LinkClass *L)
	{
		LinkClass *p = L;
		int choice = 0;
		int id = 0;
		string name;
		bool flag = false;
		cout << "[当前状态] <查找>  请选择:" << endl;
		cout << "\t1  按工号查找" << endl;
		cout << "\t2  按姓名查找" << endl;
		cin >> choice;
		while (true)
		{
			if (1 == choice)
			{
				cout << "[当前状态] <查找>  请输入工号:>";
				cin >> id;
				while (p)
				{
					if (p->wp->M_Id == id)
					{
						if (p->wp->M_Duty > 0)
							p->wp->showInfo();
						flag = true;
					}
					p = p->next;
				}
				break;
			}
			else if (2 == choice)
			{
				cout << "[当前状态] <查找>  请输入姓名:>";
				cin >> name;
				while (p)
				{
					if (p->wp->M_Name == name)
					{
						if (p->wp->M_Duty > 0)
							p->wp->showInfo();
						flag = true;
					}
					p = p->next;
				}
				break;
			}
			else
			{
				cout << "[当前状态] <查找>  输入选项无效!" << endl;
			}
		}
		if (!flag)
			cout << "[当前状态] <查找>  查找结果不存在!" << endl;
		return false;
	}
	void WorkerManager::Ems_Show(const LinkClass *L)
	{
		if (!M_size)
			cout << "table为空!" << endl;
		else
		{
			LinkClass *p = L->next;
			cout << "工号" << "\t姓名" << "\t职位" << "\t工作内容" << endl;
			while (p)
			{
				p->wp->showInfo();
				p = p->next;
			}
		}
	}

	void WorkerManager::Ems_DeleteAll(LinkClass *L)
	{
		LinkClass *p = L;
		if (0 == M_size)
			return;
		string input;
		cout << "[当前状态] <删除全部数据>  请输入' yes '确认(输入其他视为取消操作) :>";
		cin >> input;
		if (input == "yes")
		{
			this->DeleteLink(p);
			cout << "全部data已删除!" << endl;
		}
	}

<worker.cpp>

#define _CRT_SECURE_NO_WARNINGS 1
#include "Ems.h"

Boss::Boss(int id,int duty,string name)
{
	M_Id = id;
	M_Duty = duty;
	M_Name = name;
}
void Boss::showInfo()
{
	cout << this->M_Id << "\t" << this->M_Name
		<<"\t"<<this->getDeptName() << endl;
}
string Boss::getDeptName()
{
	return string("老板\t管理公司所有事务");
}


Manager::Manager(int id, int duty, string name)
{
	M_Id = id;
	M_Duty = duty;
	M_Name = name;
}
void Manager::showInfo()
{
	cout << this->M_Id << "\t" << this->M_Name
		<< "\t" << this->getDeptName() << endl;
}

string Manager::getDeptName()
{
	return string("经理\t完成老板安排的任务,并分发任务给员工");
}

FlWorker::FlWorker(int id, int duty, string name)
{
	M_Id = id;
	M_Duty = duty;
	M_Name = name;
}
void FlWorker::showInfo()
{
	cout << this->M_Id << "\t" << this->M_Name
		<< "\t" << this->getDeptName() << endl;
}

string FlWorker::getDeptName()
{
	return string("员工\t完成经理安排的任务");
}

<test.cpp>

#define _CRT_SECURE_NO_WARNINGS 1
#include "Ems.h"

enum Ch
{
	EMS_EXIT,//退出 0
	EMS_ADD,//增 1
	EMS_DELETE,//删 2
	EMS_EDIT,//改3
	EMS_FIND,//查 4
	EMS_SHOW,//显示 5
	EMS_DELETEALL//销毁表 6
};
void test()
{
	LinkClass Lc;
	WorkerManager w(&Lc);
	int choice = 0;
	//bool flag = true;
	InfoLink(&Lc, &w);

	while (true)
	{
		//if (!flag)
		//	break;
		w.ShowMenu();
		cout << "[当前状态] <菜单>  请选择:>";
		cin >> choice;
		cin.clear(); cin.ignore();
		switch (choice)
		{
		case EMS_EXIT://退出
			w.Ems_Write(&Lc);
			cout << "程序结束" << endl;
			//flag = false;
			return;
			break;
		case EMS_ADD://增
			w.Ems_Add(&Lc);
			w.Ems_Write(&Lc);
			system("pause");
			system("cls");
			break;
		case EMS_DELETE://删
			w.Ems_Delete(&Lc);
			w.Ems_Write(&Lc);
			system("pause");
			system("cls");
			break;
		case EMS_EDIT://改
			w.Ems_Edit(&Lc);
			w.Ems_Write(&Lc);
			system("pause");
			system("cls");
			break;
		case EMS_FIND://查
			w.Ems_Find(&Lc);
			system("pause");
			system("cls");
			break;
		case EMS_SHOW://显示
			w.Ems_Show(&Lc);
			system("pause");
			system("cls");
			break;
		case EMS_DELETEALL://删除所有
			w.Ems_DeleteAll(&Lc);
			w.Ems_Write(&Lc);
			system("pause");
			system("cls");
			break;
		case -1:
			system("cls");
			break;
		default:
			break;
		}
	}
}
int main()
{
	test();
	system("pause");
	return 0;
}