从0到1入门C++编程——07 基于多态的职工管理系统

news2024/11/24 16:12:30

文章目录

  • 一、创建管理类及菜单功能实现
  • 二、创建职工抽象类
  • 三、退出管理程序
  • 四、增加职工信息
  • 五、读写文件操作
  • 六、显示职工信息
  • 七、删除职工信息
  • 八、修改职工信息
  • 九、查找职工信息
  • 十、对职工信息排序
  • 十一、清空文件内容
  • 十二、工程文件构成


本案例中利用C++实现一个基于多态的职工管理系统。公司中职工分为三类:普通员工、经理、老板,显示信息时,需要显示职工编号、职工姓名以及职工岗位。
该管理系统需要具备如下功能:
退出管理程序:退出当前管理系统;
增加职工信息:可以实现批量添加职工信息的功能,并将信息写入到文件中,职工信息包括职工编号、姓名、部门编号;
显示职工信息:显示公司内部所有职工的信息;
删除职工信息:按照编号删除指定的职工信息;
修改职工信息:根据编号修改职工的信息;
查找职工信息:按照职工的编号或者职工的姓名查找相关的人员信息;
对职工信息排序:根据职工编号进行排序,排序规则可以由用户指定;
清空文件内容:清空文件中记录的所有职工信息,但在清空前需要再次确认,防止误删。


一、创建管理类及菜单功能实现

在写代码之前,先在Visual Studio中创建一个项目,然后新建一个C++文件。
管理类完成的功能主要有:与用户的沟通菜单界面;对职工增删改查的操作;与文件的读写交互。
为了文件之间功能清晰,分别创建头文件和C++文件用来创建管理类,如下图所示。
在这里插入图片描述
WorkerManager.h头文件中暂时包括下面的内容。

#pragma once   //防止头文件重复包含
#include <iostream>
using namespace std;

class WorkerManager
{
public:
	WorkerManager();   //构造函数
	void show_menu();  //显示菜单函数的声明
	~WorkerManager();  //析构函数
};

WorkerManager.cpp文件中包含显示菜单函数的实现。

#include "workerManager.h"

WorkerManager::WorkerManager()
{

}

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;
}

WorkerManager::~WorkerManager()
{

}

main.cpp文件中简单的实例化一个管理类对象,然后调用菜单显示函数。

#include <iostream>
#include <fstream>
#include <string>
using namespace std;
#include "workerManager.h"

int main()
{
	WorkerManager wm;  //实例化一个对象
	wm.show_menu();  //调用成员函数显示菜单

	system("pause");
	return 0;
}

有以上代码之后,运行程序之后就可以显示菜单了,如下图所示。
在这里插入图片描述
后面各个功能的实现只需要往里面添加函数就可以了。


二、创建职工抽象类

职工分为普通员工、经理、老板,写一个通用的父类,里面包含员工编号、员工姓名、员工所在部门编号,然后分别创建普通员工、经理和老板类继承父类,重写里面相应的函数。
创建一个worker.h头文件,在里面创建职工抽象类,然后分别写子类继承抽象类重写其成员函数。

#pragma once   //防止头文件重复包含
#include <iostream>
#include <string>
using namespace std;

class Worker
{
public:
	//成员方法
	virtual void show_info() = 0;  //显示员工信息的纯虚函数
	virtual string get_dep() = 0;  //获取员工部门的纯虚函数
	//成员属性
	int worker_id;  //员工编号
	string name;  //员工姓名
	int dep_id;  //员工部门编号
};

class Employee : public Worker  //普通职工类
{
public:
	Employee(int worker_id,string name,int dep_id)
	{
		this->worker_id = worker_id;
		this->name = name;
		this->dep_id = dep_id;
	}
	void show_info()  //显示员工信息的函数实现
	{
		cout<<"职工编号:"<<worker_id<<"\t职工姓名:"<<name<<"\t职工岗位:"<<get_dep()<<endl;
	}
	string get_dep()  //获取员工部门的函数实现
	{
		return "普通员工";
	}
};

class Manager : public Worker  //经理类
{
public:
	Manager(int worker_id,string name,int dep_id)
	{
		this->worker_id = worker_id;
		this->name = name;
		this->dep_id = dep_id;
	}
	void show_info()  //显示员工信息的函数实现
	{
		cout<<"职工编号:"<<worker_id<<"\t职工姓名:"<<name<<"\t职工岗位:"<<get_dep()<<endl;
	}
	string get_dep()  //获取员工部门的函数实现
	{
		return "经理";
	}
};

class Boss : public Worker  //老板类
{
public:
	Boss(int worker_id,string name,int dep_id)
	{
		this->worker_id = worker_id;
		this->name = name;
		this->dep_id = dep_id;
	}
	void show_info()  //显示员工信息的函数实现
	{
		cout<<"职工编号:"<<worker_id<<"\t职工姓名:"<<name<<"\t职工岗位:"<<get_dep()<<endl;
	}
	string get_dep()  //获取员工部门的函数实现
	{
		return "老板";
	}
};

在main.cpp中继承该头文件,使用如下代码进行测试。

Worker *w = new Employee(1,"张三",1);
	w->show_info();
	delete w;
	w = new Manager(2,"李四",2);
	w->show_info();
	delete w;
	w = new Boss(3,"王五",3);
	w->show_info();
	delete w;

测试结果如下图所示。
在这里插入图片描述


三、退出管理程序

退出管理系统就是在用户输入0之后退出系统,同样的先在管理类中声明函数,然后在相应的C++文件中实现函数,然后在main函数中通过实例化的对象调用函数退出管理程序。
退出管理程序的函数实现如下。

void WorkerManager::exit_system() //退出系统函数的实现
{
	cout<<"欢迎下次继续使用!"<<endl;
	system("pause");  //按任意键继续
	exit(0);  //退出程序
}

主函数中根据用户输入的数字决定接下来要进行的操作。

int main()
{
	WorkerManager wm;  //实例化一个对象
	int menu_choice = 0;  //用户菜单选择
	while(1)
	{
		wm.show_menu();  //调用成员函数显示菜单
		cout<<"请输入您要操作的菜单编号:";
		cin>>menu_choice;
		switch(menu_choice)
		{
			case 0:  //退出管理程序
				wm.exit_system();
				break;
			case 1:  //增加职工信息
				break;
			case 2:  //显示职工信息
				break;
			case 3:  //删除职工信息
				break;
			case 4:  //修改职工信息
				break;
			case 5:  //查找职工信息
				break;
			case 6:  //按照选择排序
				break;
			case 7:  //清空所有信息
				break;
			default:
				system("cls");  //清屏操作
				break;
		}
	}

	system("pause");
	return 0;
}

程序运行结果如下图所示。
在这里插入图片描述


四、增加职工信息

可以批量增加职工信息,职工信息需要保存到文件中。
用户在批量创建时,可能会创建不同种类的职工,如果要将不同种类的员工信息存入到一个数组中,可以将所有职工的指针维护到一个数组里。如果想在程序中维护不定长度的数组,可以将数组创建到堆区,并利用Worker **的指针维护。
在WorkerManager.cpp文件中添加下面的代码增加职工信息,在添加新职工前需要先判断要添加的职工编号是否已经存在。

void WorkerManager::add_employee()  //添加职工信息函数的实现
{
	cout<<"请输入要添加职工的数量:";
	int add_num=0;
	cin>>add_num;
	if(add_num > 0)
	{
		int newsize = this->Num + add_num; //新空间的数组大小
		Worker **newspace = new Worker*[newsize];  //开辟新空间
		//如果原来的数组不为空就进行拷贝
		if(this->w_arr != NULL)
		{
			for(int i=0;i<this->Num;i++)
			{
				newspace[i] = this->w_arr[i];  //将原数组中的数据拷贝到扩展后的新数组中
			}
		}
		//批量添加职工信息
		for(int i=0;i<add_num;i++)
		{
			int w_id;
			string name;
			int d_id;
			cout<<"请输入第"<<i+1<<"个职工的职工编号:";
			cin>>w_id;
			while(1)   //根据职工编号判断职工信息是否已经存在
			{
				int j;
				for(j=0;j<this->Num+i;j++)
				{
					if(w_id == newspace[j]->worker_id)
					{
						break;
					}
				}
				if(j==this->Num+i)   //没有重复的职工编号
				{
					break;
				}
				else
				{
					cout<<"编号为"<<w_id<<"的职工信息已存在!"<<endl;
					cout<<"请重新输入第"<<i+1<<"个职工的职工编号:";
					cin>>w_id;
				}
			}
			cout<<"请输入第"<<i+1<<"个职工的职工姓名:";
			cin>>name;
			cout<<"1.普通职工"<<endl;
			cout<<"2.经理"<<endl;
			cout<<"3.老板"<<endl;
			cout<<"请选择该职工的岗位编号(1-3):";
			cin>>d_id;
			while(1)   //确保输入正确
			{
				if(d_id == 1||d_id == 2||d_id == 3)
					break;
				else
				{
					cout<<"职工岗位编号输入有误,请重新输入(1-3):";
					cin>>d_id;
				}
			}
			
			//保存输入员工的信息
			Worker *w = NULL;
			switch(d_id)
			{
				case 1:
					w = new Employee(w_id,name,d_id);
					break;
				case 2:
					w = new Manager(w_id,name,d_id);
					break;
				case 3:
					w = new Boss(w_id,name,d_id);
					break;
				default:
					break;
			}
			//将新添加的职工指针保存到数组指针中
			newspace[this->Num+i] = w;
		}
		delete []this->w_arr;   //释放原有数组
		this->w_arr = newspace;   //更新新空间的指向
		this->Num = newsize;   //更新人数
		this->save_to_file();  //保存数据到文件中
		this->fileIsEmpty = false;   //文件不为空
		cout<<"成功添加"<<add_num<<"名职工的信息!"<<endl;
	}
	else
	{
		cout<<"输入有误!"<<endl;
	}
	//按任意键返回上级并清屏
	system("pause");
	system("cls");
}

程序运行结果如下图所示。
在这里插入图片描述


五、读写文件操作

每次重新运行程序的时候,数组中存放的内容都是空的,上一次运行后的数据在程序结束时会被删除,这不太符合实际,应当将每次运行程序后添加的数据写入到文件中,这样在程序再次运行时,数据也是存在的。
将新添加的职工数据写入到文件中的函数实现如下。

void WorkerManager::save_to_file()  //将数据保存到文件的函数实现
{
	ofstream ofs;
	ofs.open(FILENAME,ios::out);  //往文件中写数据
	//将所有员工的数据写入到文件中
	//ofs <<"职工编号\t"<<"职工姓名\t"<<"职工部门"<<endl;
	for(int i=0;i<this->Num;i++)
	{
		ofs << w_arr[i]->worker_id<<"\t"
			<< w_arr[i]->name<<"\t"
			<< w_arr[i]->dep_id<<endl;
	}
	ofs.close();
}

可以看到,用户输入的各项信息成功的写入到了文件中。
在这里插入图片描述
还有读文件的操作,文件的状态在本案例中应当有三种。第一种是文件不存在,在第一次添加员工后,文件才会创建;第二种是文件存在,但是里面的内容为空,就是添加员工信息之后又删除了;第三种是文件存在且里面的内容不为空,这种情况就比较复杂,需要将文件中记录的员工数量进行统计,然后再对相关属性进行初始化。
WorkerManager.cpp文件中的相关函数如下。

int WorkerManager::getEmpNum()   //统计文件中的职工个数的函数实现
{
	ifstream ifs;
	ifs.open(FILENAME,ios::in);  //读文件
	int w_id;
	string name;
	int d_id;
	int num=0;
	while(ifs>>w_id && ifs>>name && ifs>>d_id)
	{
		num++;
	}
	return num;
}

void WorkerManager::initEmp()  //初始化员工的函数实现
{
	ifstream ifs;
	ifs.open(FILENAME,ios::in);
	int w_id;
	string name;
	int d_id;
	int index=0;
	while(ifs>>w_id && ifs>>name && ifs>>d_id)
	{
		Worker *w = NULL;
		if(d_id==1)
		{
			w = new Employee(w_id,name,d_id);  //普通员工
		}
		else if(d_id==2)
		{
			w = new Manager(w_id,name,d_id);  //经理
		}
		else
		{
			w = new Boss(w_id,name,d_id);  //老板
		}
		this->w_arr[index] = w;  //存放到数组中
		index++;
	}
	ifs.close();
}

构造函数中对应三种情况的初始化代码如下。

WorkerManager::WorkerManager()
{
	ifstream ifs;
	ifs.open(FILENAME,ios::in);  //读文件
	//1.文件不存在
	if(!ifs.is_open())   
	{
		//初始化属性
		this->Num = 0;
		this->w_arr = NULL;
		this->fileIsEmpty = true;
		ifs.close();
		return;   //返回,不进行后续操作
	}
	
	//2.文件存在且内容为空
	char ch;
	ifs >> ch;  //读一个字符
	if(ifs.eof())   
	{
		//初始化属性
		this->Num = 0;
		this->w_arr = NULL;
		this->fileIsEmpty = true;
		ifs.close();
		return;   //返回,不进行后续操作
	}

	//3.文件存在且内容不为空
	this->fileIsEmpty = false;
	int num = this->getEmpNum();  //获取文件中已有的职工数量
	//初始化属性
	this->Num = num; 
	this->w_arr = new Worker*[this->Num];  //在堆区开辟数组
	this->initEmp();  //将文件中的数据保存到数组
}

六、显示职工信息

显示职工信息比较简单,首先判断文件是否存在,如果不存在就打印提示信息,如果存在就将所有的职工信息进行输出。

void WorkerManager::display_employee()  //显示职工信息函数实现
{
	if(this->fileIsEmpty)
	{
		cout<<"文件不存在或记录为空,没有可显示的内容!"<<endl;
	}
	else
	{
		for(int i=0;i<this->Num;i++)
		{
			this->w_arr[i]->show_info();  //显示职工信息
		}
	}
	//按任意键后清屏
	system("pause");
	system("cls");
}

程序运行的结果如下图所示。
在这里插入图片描述
如果将文件删除,再次运行程序,结果如下图所示。
在这里插入图片描述


七、删除职工信息

删除职工信息需要注意将职工的数量和数组指针做同步的更新,并将信息在文件中也做同步更新。
在删除职工信息之前需要先判断该职工信息是否存在,删除职工信息的函数实现如下。

int WorkerManager::isExist(int id)   //判断职工是否存在的函数实现
{
	for(int i=0;i<this->Num;i++)
	{
		if(this->w_arr[i]->worker_id == id)
			return i;
	}
	return -1;
}

void WorkerManager::delete_employee()  //删除职工信息函数实现
{
	if(this->fileIsEmpty)
	{
		cout<<"文件不存在或记录为空,无法进行删除操作!"<<endl;
	}
	else
	{
		int w_id,ret;
		cout<<"请输入要删除的职工编号:";
		cin>>w_id;
		ret = this->isExist(w_id);
		if(ret != -1) 
		{
			for(int i=ret;i<this->Num-1;i++)
			{
				this->w_arr[i] = this->w_arr[i+1];
			}
			this->Num--;  //更新数组中存放的元素个数
			this->save_to_file();  //数据同步更新到文件中
			cout<<"已删除职工编号为"<<w_id<<"的职工信息!"<<endl;
		}
		else
		{
			cout<<"职工编号为"<<w_id<<"的职工不存在,删除失败!"<<endl;
		}
	}
	//按任意键后清屏
	system("pause");
	system("cls");
}

先显示一下现有的职工信息,如下图所示。
在这里插入图片描述
然后删除掉其中的一个职工的信息,如下图所示,提示删除成功。
在这里插入图片描述
再次显示职工信息,如下图所示,删除确实成功了。
在这里插入图片描述
再打开对应的文件查看内容,如下图所示,信息是同步的,文件中的数据也被删除掉了。
在这里插入图片描述
如果输入一个不存在的职工编号,会出现如下图所示的提示信息。
在这里插入图片描述


八、修改职工信息

修改职工信息时,再查找到对应的职工编号后,删除原有记录,然后根据用户输入在该位置添加新的职工信息。
修改职工信息的函数实现代码如下。

void WorkerManager::modify_employee()  //修改职工信息函数实现
{
	if(this->fileIsEmpty)
	{
		cout<<"文件不存在或记录为空,无法进行修改操作!"<<endl;
	}
	else
	{
		int w_id,ret;
		cout<<"请输入要修改的职工编号:";
		cin>>w_id;
		ret = this->isExist(w_id);
		if(ret != -1)
		{
			delete this->w_arr[ret];
			int new_id;
			string new_name;
			int new_d_id;
			cout<<"职工编号为"<<w_id<<"的职工信息存在,请输入新的职工编号:";
			cin>>new_id;
			cout<<"请输入新的职工姓名:";
			cin>>new_name;
			cout<<"1.普通职工"<<endl;
			cout<<"2.经理"<<endl;
			cout<<"3.老板"<<endl;
			cout<<"请选择该职工的岗位编号(1-3):";
			cin>>new_d_id;
			while(1)   //确保输入正确
			{
				if(new_d_id == 1||new_d_id == 2||new_d_id == 3)
					break;
				else
				{
					cout<<"职工岗位编号输入有误,请重新输入(1-3):";
					cin>>new_d_id;
				}
			}
			
			//保存输入员工的信息
			Worker *w = NULL;
			switch(new_d_id)
			{
				case 1:
					w = new Employee(new_id,new_name,new_d_id);
					break;
				case 2:
					w = new Manager(new_id,new_name,new_d_id);
					break;
				case 3:
					w = new Boss(new_id,new_name,new_d_id);
					break;
				default:
					break;
			}
			//将修改的职工指针保存到数组指针中
			this->w_arr[ret] = w;
			this->save_to_file();  //数据同步更新到文件中
			cout<<"职工编号为"<<w_id<<"的职工信息修改成功!"<<endl;
		}
		else
		{
			cout<<"职工编号为"<<w_id<<"的职工不存在!"<<endl;
		}
	}
	//按任意键后清屏
	system("pause");
	system("cls");
}

程序运行后同样先显示职工信息,如下图所示。
在这里插入图片描述
然后修改职工信息,修改过程如下图所示。
在这里插入图片描述
修改完成后再显示职工信息如下图所示。
在这里插入图片描述
修改完成后,再输入旧的职工编号进行修改,提示该职工不存在。
在这里插入图片描述
修改完成后,打开文件如下图所示,信息都同步更新了!
在这里插入图片描述


九、查找职工信息

查找职工信息可以按照职工编号查询,也可以按照职工姓名进行查询。
查找职工信息的函数实现代码如下。

void WorkerManager::find_employee()  //查找职工信息函数实现
{
	if(this->fileIsEmpty)
	{
		cout<<"文件不存在或记录为空,无法进行查找操作!"<<endl;
	}
	else
	{
		cout<<"1.按职工编号查"<<endl;
		cout<<"2.按职工姓名查"<<endl;
		cout<<"请选择要查找的方式(1-2):";
		int select;
		cin>>select;
		while(1)   //确保输入正确
		{
			if(select == 1||select == 2)
				break;
			else
			{
				cout<<"输入有误,请重新选择要查找的方式(1-2):";
				cin>>select;
			}
		}
		if(select==1)  //按职工编号查
		{
			cout<<"请输入要查找的职工编号:";
			int id;
			cin>>id;
			if(isExist(id)!=-1)
			{
				cout<<"查找成功,该职工的信息如下:"<<endl;
				this->w_arr[isExist(id)]->show_info();
			}
			else
			{
				cout<<"职工编号为"<<id<<"的职工信息不存在!"<<endl;
			}
		}
		else  //按职工姓名查
		{
			cout<<"请输入要查找的职工姓名:";
			bool flag=false;
			string name;
			cin>>name;
			for(int i=0;i<this->Num;i++)
			{
				if(name==this->w_arr[i]->name)
				{
					if(!flag)
					{
						cout<<"查找成功,职工的信息如下:"<<endl;
					}
					this->w_arr[i]->show_info();
					flag=true;
				}
			}
			if(!flag)
			{
				cout<<"职工姓名为"<<name<<"的职工信息不存在!"<<endl;
			}
		}
	}
	//按任意键后清屏
	system("pause");
	system("cls");
}

程序运行后还是先显示一下职工信息,如下图所示。
在这里插入图片描述
按照职工编号查询的过程如下图所示。
在这里插入图片描述
按照职工姓名查询的过程如下图所示,按照职工姓名查询时可能会遇到重名的职工,要将所有同名的职工信息都进行打印。
在这里插入图片描述
按照职工编号查询不存在的情况如下图所示。
在这里插入图片描述
按照职工姓名查询不存在的情况如下图所示。
在这里插入图片描述


十、对职工信息排序

对职工信息排序时按照职工编号进行排序,具体是升序还是降序由用户选择。
对职工信息排序的函数代码实现如下。

void WorkerManager::sort_employee()  //对职工信息排序的函数实现
{
	if(this->fileIsEmpty)
	{
		cout<<"文件不存在或记录为空,无法进行排序操作!"<<endl;
		//按任意键后清屏
		system("pause");
		system("cls");
	}
	else
	{
		cout<<"1.按照职工编号升序排列"<<endl;
		cout<<"2.按照职工编号降序排列"<<endl;
		cout<<"请选择要排序的方式(1-2):";
		int select;
		cin>>select;
		while(1)   //确保输入正确
		{
			if(select == 1||select == 2)
				break;
			else
			{
				cout<<"输入有误,请重新选择要排序的方式(1-2):";
				cin>>select;
			}
		}
		
		for(int i=0;i<this->Num;i++)
		{
			int m=i;
			for(int j=i+1;j<this->Num;j++)
			{
				if(select == 1)  //按照职工编号升序排列
				{
					if(this->w_arr[j]->worker_id < this->w_arr[m]->worker_id)
					{
						m = j;
					}
				}
				else  //按照职工编号降序排列
				{
					if(this->w_arr[j]->worker_id > this->w_arr[m]->worker_id)
					{
						m = j;
					}
				}
			}
			if(m != i)  //m的值有变化就交换
			{
				Worker *temp = w_arr[i];
				w_arr[i] = w_arr[m];
				w_arr[m] = temp;
			}
		}
		this->save_to_file();   //将信息同步到文件中
		cout<<"排序成功!排序后的结果如下:"<<endl;
		this->display_employee();  //该函数中有按任意键后清屏操作
	}
}

程序运行后先显示一下职工信息,如下图所示,是无序的。
在这里插入图片描述
选择按职工编号升序排列的执行过程如下图所示。
在这里插入图片描述
选择按职工编号降序排列的执行过程如下图所示。
在这里插入图片描述
文件中的信息如下图所示,也是同步变化的。
在这里插入图片描述


十一、清空文件内容

清空文件内容需要在文件打开方式中将其设置为 ios::trunc,如果文件存在就先删除,再创建。然后需要操作的就是将数组中的数据清空,同时将职工总数量设置为0。
清空文件内容函数的代码如下。

void WorkerManager::clear_file()  //清空文件的函数实现
{
	if(this->fileIsEmpty)
	{
		cout<<"文件不存在或已经为空!"<<endl;
	}
	else
	{
		cout<<"1.确定"<<endl;
		cout<<"2.取消"<<endl;
		cout<<"确定清空文件数据?";
		int select;
		cin>>select;
		if(select==1)
		{
			ofstream ofs;
			ofs.open(FILENAME,ios::trunc);  //文件存在就删除文件,并重新创建
			ofs.close();
			//释放堆区内存
			if(this->w_arr != NULL)
			{
				for(int i=0;i<this->Num;i++)  //将每个元素都置空
				{
					delete this->w_arr[i];
					this->w_arr[i] = NULL;
				}
				delete []this->w_arr;   //删除并置空堆区数组指针
				this->w_arr = NULL;
			}
			//初始化属性
			this->Num = 0;
			this->fileIsEmpty = true;
			cout<<"文件清空成功!"<<endl;
		}
	}
	//按任意键后清屏
	system("pause");
	system("cls");
}

程序运行后先显示职工信息,如下图所示。
在这里插入图片描述
清空后打开文件如下图所示,文件内容也被清空了。
在这里插入图片描述
文件被清空后,只能选择菜单0退出程序或菜单1增加职工信息,其它操作均不能进行。
文件被清空后执行显示操作如下图所示。
在这里插入图片描述
文件被清空后执行删除操作如下图所示。
在这里插入图片描述
文件被清空后执行修改操作如下图所示。
在这里插入图片描述
文件被清空后执行查找操作如下图所示。
在这里插入图片描述
文件被清空后执行排序操作如下图所示。
在这里插入图片描述
文件被清空后执行清空文件的操作如下图所示。
在这里插入图片描述


十二、工程文件构成

本案例的工程主要包含以下四个文件。
在这里插入图片描述
worker.h文件的内容如下。

#pragma once   //防止头文件重复包含
#include <iostream>
#include <string>
using namespace std;

class Worker
{
public:
	//成员方法
	virtual void show_info() = 0;  //显示员工信息的纯虚函数
	virtual string get_dep() = 0;  //获取员工部门的纯虚函数
	//成员属性
	int worker_id;  //员工编号
	string name;  //员工姓名
	int dep_id;  //员工部门编号
};

class Employee : public Worker  //普通职工类
{
public:
	Employee(int worker_id,string name,int dep_id)
	{
		this->worker_id = worker_id;
		this->name = name;
		this->dep_id = dep_id;
	}
	void show_info()  //显示员工信息的函数实现
	{
		cout<<"职工编号:"<<worker_id<<"\t职工姓名:"<<name<<"\t职工岗位:"<<get_dep()<<endl;
	}
	string get_dep()  //获取员工部门的函数实现
	{
		return "普通员工";
	}
};

class Manager : public Worker  //经理类
{
public:
	Manager(int worker_id,string name,int dep_id)
	{
		this->worker_id = worker_id;
		this->name = name;
		this->dep_id = dep_id;
	}
	void show_info()  //显示员工信息的函数实现
	{
		cout<<"职工编号:"<<worker_id<<"\t职工姓名:"<<name<<"\t职工岗位:"<<get_dep()<<endl;
	}
	string get_dep()  //获取员工部门的函数实现
	{
		return "经理";
	}
};

class Boss : public Worker  //老板类
{
public:
	Boss(int worker_id,string name,int dep_id)
	{
		this->worker_id = worker_id;
		this->name = name;
		this->dep_id = dep_id;
	}
	void show_info()  //显示员工信息的函数实现
	{
		cout<<"职工编号:"<<worker_id<<"\t职工姓名:"<<name<<"\t职工岗位:"<<get_dep()<<endl;
	}
	string get_dep()  //获取员工部门的函数实现
	{
		return "老板";
	}
};

workerManager.h文件的内容如下。

#pragma once   //防止头文件重复包含
#include <iostream>
#include <fstream>  //文件操作的头文件
using namespace std;
#include "worker.h"
#define FILENAME "Employee.txt"  //宏定义文件名称

class WorkerManager
{
public:
	WorkerManager();   //构造函数
	void show_menu();  //显示菜单函数的声明
	void exit_system();  //退出系统函数的声明
	int Num;   //总人数
	Worker **w_arr;  //存放职工的数组指针
	void add_employee();  //添加职工信息函数声明
	void save_to_file();  //将数据保存到文件的函数声明
	bool fileIsEmpty;   //文件是否为空的标志
	int getEmpNum();   //统计文件中的职工个数的函数声明
	void initEmp();   //初始化员工的函数声明
	void display_employee();  //显示职工信息函数声明
	int isExist(int id);   //判断职工是否存在的函数声明
	void delete_employee();  //删除职工信息函数声明
	void modify_employee();  //修改职工信息函数声明
	void find_employee();  //查找职工信息函数声明
	void sort_employee();  //对职工信息排序的函数声明
	void clear_file();  //清空文件的函数声明
	~WorkerManager();  //析构函数
};

main.cpp文件的内容如下。

#include <iostream>
#include <string>
using namespace std;
#include "workerManager.h"
#include "worker.h"

int main()
{
	WorkerManager wm;  //实例化一个对象
	int menu_choice = 0;  //用户菜单选择
	while(1)
	{
		wm.show_menu();  //调用成员函数显示菜单
		cout<<"请输入您要操作的菜单编号:";
		cin>>menu_choice;
		switch(menu_choice)
		{
			case 0:  //退出管理程序
				wm.exit_system();
				break;
			case 1:  //增加职工信息
				wm.add_employee();
				break;
			case 2:  //显示职工信息
				wm.display_employee();
				break;
			case 3:  //删除职工信息
				wm.delete_employee();
				break;
			case 4:  //修改职工信息
				wm.modify_employee();
				break;
			case 5:  //查找职工信息
				wm.find_employee();
				break;
			case 6:  //按照选择排序
				wm.sort_employee();
				break;
			case 7:  //清空所有信息
				wm.clear_file();
				break;
			default:
				system("cls");  //清屏操作
				break;
		}
	}

	system("pause");
	return 0;
}

WorkerManager.cpp文件中的内容如下。

#include "workerManager.h"

WorkerManager::WorkerManager()
{
	ifstream ifs;
	ifs.open(FILENAME,ios::in);  //读文件
	//1.文件不存在
	if(!ifs.is_open())   
	{
		//初始化属性
		this->Num = 0;
		this->w_arr = NULL;
		this->fileIsEmpty = true;
		ifs.close();
		return;   //返回,不进行后续操作
	}
	
	//2.文件存在且内容为空
	char ch;
	ifs >> ch;  //读一个字符
	if(ifs.eof())   
	{
		//初始化属性
		this->Num = 0;
		this->w_arr = NULL;
		this->fileIsEmpty = true;
		ifs.close();
		return;   //返回,不进行后续操作
	}

	//3.文件存在且内容不为空
	this->fileIsEmpty = false;
	int num = this->getEmpNum();  //获取文件中已有的职工数量
	//初始化属性
	this->Num = num; 
	this->w_arr = new Worker*[this->Num];  //在堆区开辟数组
	this->initEmp();  //将文件中的数据保存到数组
}

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::exit_system() //退出系统函数的实现
{
	cout<<"欢迎下次继续使用!"<<endl;
	system("pause");  //按任意键继续
	exit(0);  //退出程序
}

void WorkerManager::add_employee()  //添加职工信息函数的实现
{
	cout<<"请输入要添加职工的数量:";
	int add_num=0;
	cin>>add_num;
	if(add_num > 0)
	{
		int newsize = this->Num + add_num; //新空间的数组大小
		Worker **newspace = new Worker*[newsize];  //开辟新空间
		//如果原来的数组不为空就进行拷贝
		if(this->w_arr != NULL)
		{
			for(int i=0;i<this->Num;i++)
			{
				newspace[i] = this->w_arr[i];  //将原数组中的数据拷贝到扩展后的新数组中
			}
		}
		//批量添加职工信息
		for(int i=0;i<add_num;i++)
		{
			int w_id;
			string name;
			int d_id;
			cout<<"请输入第"<<i+1<<"个职工的职工编号:";
			cin>>w_id;
			while(1)      //根据职工编号判断职工信息是否已经存在
			{
				int j;
				for(j=0;j<this->Num+i;j++)
				{
					if(w_id == newspace[j]->worker_id)
					{
						break;
					}
				}
				if(j==this->Num+i)   //没有重复的职工编号
				{
					break;
				}
				else
				{
					cout<<"编号为"<<w_id<<"的职工信息已存在!"<<endl;
					cout<<"请重新输入第"<<i+1<<"个职工的职工编号:";
					cin>>w_id;
				}
			}
			cout<<"请输入第"<<i+1<<"个职工的职工姓名:";
			cin>>name;
			cout<<"1.普通职工"<<endl;
			cout<<"2.经理"<<endl;
			cout<<"3.老板"<<endl;
			cout<<"请选择该职工的岗位编号(1-3):";
			cin>>d_id;
			while(1)   //确保输入正确
			{
				if(d_id == 1||d_id == 2||d_id == 3)
					break;
				else
				{
					cout<<"职工岗位编号输入有误,请重新输入(1-3):";
					cin>>d_id;
				}
			}
			
			//保存输入员工的信息
			Worker *w = NULL;
			switch(d_id)
			{
				case 1:
					w = new Employee(w_id,name,d_id);
					break;
				case 2:
					w = new Manager(w_id,name,d_id);
					break;
				case 3:
					w = new Boss(w_id,name,d_id);
					break;
				default:
					break;
			}
			//将新添加的职工指针保存到数组指针中
			newspace[this->Num+i] = w;
		}
		delete []this->w_arr;   //释放原有数组
		this->w_arr = newspace;   //更新新空间的指向
		this->Num = newsize;   //更新人数
		this->save_to_file();  //保存数据到文件中
		this->fileIsEmpty = false;   //文件不为空
		cout<<"成功添加"<<add_num<<"名职工的信息!"<<endl;
	}
	else
	{
		cout<<"输入有误!"<<endl;
	}
	//按任意键返回上级并清屏
	system("pause");
	system("cls");
}

void WorkerManager::save_to_file()  //将数据保存到文件的函数实现
{
	ofstream ofs;
	ofs.open(FILENAME,ios::out);  //往文件中写数据
	//将所有员工的数据写入到文件中
	//ofs <<"职工编号\t"<<"职工姓名\t"<<"职工部门"<<endl;
	for(int i=0;i<this->Num;i++)
	{
		ofs << w_arr[i]->worker_id<<"\t"
			<< w_arr[i]->name<<"\t"
			<< w_arr[i]->dep_id<<endl;
	}
	ofs.close();
}

int WorkerManager::getEmpNum()   //统计文件中的职工个数的函数实现
{
	ifstream ifs;
	ifs.open(FILENAME,ios::in);  //读文件
	int w_id;
	string name;
	int d_id;
	int num=0;
	while(ifs>>w_id && ifs>>name && ifs>>d_id)
	{
		num++;
	}
	return num;
}

void WorkerManager::initEmp()  //初始化员工的函数实现
{
	ifstream ifs;
	ifs.open(FILENAME,ios::in);
	int w_id;
	string name;
	int d_id;
	int index=0;
	while(ifs>>w_id && ifs>>name && ifs>>d_id)
	{
		Worker *w = NULL;
		if(d_id==1)
		{
			w = new Employee(w_id,name,d_id);  //普通员工
		}
		else if(d_id==2)
		{
			w = new Manager(w_id,name,d_id);  //经理
		}
		else
		{
			w = new Boss(w_id,name,d_id);  //老板
		}
		this->w_arr[index] = w;  //存放到数组中
		index++;
	}
	ifs.close();
}

void WorkerManager::display_employee()  //显示职工信息函数实现
{
	if(this->fileIsEmpty)
	{
		cout<<"文件不存在或记录为空,没有可显示的内容!"<<endl;
	}
	else
	{
		for(int i=0;i<this->Num;i++)
		{
			this->w_arr[i]->show_info();  //显示职工信息
		}
	}
	//按任意键后清屏
	system("pause");
	system("cls");
}

int WorkerManager::isExist(int id)   //判断职工是否存在的函数实现
{
	for(int i=0;i<this->Num;i++)
	{
		if(this->w_arr[i]->worker_id == id)
			return i;
	}
	return -1;
}

void WorkerManager::delete_employee()  //删除职工信息函数实现
{
	if(this->fileIsEmpty)
	{
		cout<<"文件不存在或记录为空,无法进行删除操作!"<<endl;
	}
	else
	{
		int w_id,ret;
		cout<<"请输入要删除的职工编号:";
		cin>>w_id;
		ret = this->isExist(w_id);
		if(ret != -1)
		{
			for(int i=ret;i<this->Num-1;i++)
			{
				this->w_arr[i] = this->w_arr[i+1];
			}
			this->Num--;  //更新数组中存放的元素个数
			this->save_to_file();  //数据同步更新到文件中
			cout<<"已删除职工编号为"<<w_id<<"的职工信息!"<<endl;
		}
		else
		{
			cout<<"职工编号为"<<w_id<<"的职工不存在,删除失败!"<<endl;
		}
	}
	//按任意键后清屏
	system("pause");
	system("cls");
}

void WorkerManager::modify_employee()  //修改职工信息函数实现
{
	if(this->fileIsEmpty)
	{
		cout<<"文件不存在或记录为空,无法进行修改操作!"<<endl;
	}
	else
	{
		int w_id,ret;
		cout<<"请输入要修改的职工编号:";
		cin>>w_id;
		ret = this->isExist(w_id);
		if(ret != -1)
		{
			delete this->w_arr[ret];
			int new_id;
			string new_name;
			int new_d_id;
			cout<<"职工编号为"<<w_id<<"的职工信息存在,请输入新的职工编号:";
			cin>>new_id;
			cout<<"请输入新的职工姓名:";
			cin>>new_name;
			cout<<"1.普通职工"<<endl;
			cout<<"2.经理"<<endl;
			cout<<"3.老板"<<endl;
			cout<<"请选择该职工的岗位编号(1-3):";
			cin>>new_d_id;
			while(1)   //确保输入正确
			{
				if(new_d_id == 1||new_d_id == 2||new_d_id == 3)
					break;
				else
				{
					cout<<"职工岗位编号输入有误,请重新输入(1-3):";
					cin>>new_d_id;
				}
			}
			
			//保存输入员工的信息
			Worker *w = NULL;
			switch(new_d_id)
			{
				case 1:
					w = new Employee(new_id,new_name,new_d_id);
					break;
				case 2:
					w = new Manager(new_id,new_name,new_d_id);
					break;
				case 3:
					w = new Boss(new_id,new_name,new_d_id);
					break;
				default:
					break;
			}
			//将修改的职工指针保存到数组指针中
			this->w_arr[ret] = w;
			this->save_to_file();  //数据同步更新到文件中
			cout<<"职工编号为"<<w_id<<"的职工信息修改成功!"<<endl;
		}
		else
		{
			cout<<"职工编号为"<<w_id<<"的职工不存在!"<<endl;
		}
	}
	//按任意键后清屏
	system("pause");
	system("cls");
}

void WorkerManager::find_employee()  //查找职工信息函数实现
{
	if(this->fileIsEmpty)
	{
		cout<<"文件不存在或记录为空,无法进行查找操作!"<<endl;
	}
	else
	{
		cout<<"1.按职工编号查"<<endl;
		cout<<"2.按职工姓名查"<<endl;
		cout<<"请选择要查找的方式(1-2):";
		int select;
		cin>>select;
		while(1)   //确保输入正确
		{
			if(select == 1||select == 2)
				break;
			else
			{
				cout<<"输入有误,请重新选择要查找的方式(1-2):";
				cin>>select;
			}
		}
		if(select==1)  //按职工编号查
		{
			cout<<"请输入要查找的职工编号:";
			int id;
			cin>>id;
			if(isExist(id)!=-1)
			{
				cout<<"查找成功,该职工的信息如下:"<<endl;
				this->w_arr[isExist(id)]->show_info();
			}
			else
			{
				cout<<"职工编号为"<<id<<"的职工信息不存在!"<<endl;
			}
		}
		else  //按职工姓名查
		{
			cout<<"请输入要查找的职工姓名:";
			bool flag=false;
			string name;
			cin>>name;
			for(int i=0;i<this->Num;i++)
			{
				if(name==this->w_arr[i]->name)
				{
					if(!flag)
					{
						cout<<"查找成功,职工的信息如下:"<<endl;
					}
					this->w_arr[i]->show_info();
					flag=true;
				}
			}
			if(!flag)
			{
				cout<<"职工姓名为"<<name<<"的职工信息不存在!"<<endl;
			}
		}
	}
	//按任意键后清屏
	system("pause");
	system("cls");
}

void WorkerManager::sort_employee()  //对职工信息排序的函数实现
{
	if(this->fileIsEmpty)
	{
		cout<<"文件不存在或记录为空,无法进行排序操作!"<<endl;
		//按任意键后清屏
		system("pause");
		system("cls");
	}
	else
	{
		cout<<"1.按照职工编号升序排列"<<endl;
		cout<<"2.按照职工编号降序排列"<<endl;
		cout<<"请选择要排序的方式(1-2):";
		int select;
		cin>>select;
		while(1)   //确保输入正确
		{
			if(select == 1||select == 2)
				break;
			else
			{
				cout<<"输入有误,请重新选择要排序的方式(1-2):";
				cin>>select;
			}
		}
		
		for(int i=0;i<this->Num;i++)
		{
			int m=i;
			for(int j=i+1;j<this->Num;j++)
			{
				if(select == 1)  //按照职工编号升序排列
				{
					if(this->w_arr[j]->worker_id < this->w_arr[m]->worker_id)
					{
						m = j;
					}
				}
				else  //按照职工编号降序排列
				{
					if(this->w_arr[j]->worker_id > this->w_arr[m]->worker_id)
					{
						m = j;
					}
				}
			}
			if(m != i)  //m的值有变化就交换
			{
				Worker *temp = w_arr[i];
				w_arr[i] = w_arr[m];
				w_arr[m] = temp;
			}
		}
		this->save_to_file();   //将信息同步到文件中
		cout<<"排序成功!排序后的结果如下:"<<endl;
		this->display_employee();  //该函数中有按任意键后清屏操作
	}
}

void WorkerManager::clear_file()  //清空文件的函数实现
{
	if(this->fileIsEmpty)
	{
		cout<<"文件不存在或已经为空!"<<endl;
	}
	else
	{
		cout<<"1.确定"<<endl;
		cout<<"2.取消"<<endl;
		cout<<"确定清空文件数据?";
		int select;
		cin>>select;
		if(select==1)
		{
			ofstream ofs;
			ofs.open(FILENAME,ios::trunc);  //文件存在就删除文件,并重新创建
			ofs.close();
			//释放堆区内存
			if(this->w_arr != NULL)
			{
				for(int i=0;i<this->Num;i++)  //将每个元素都置空
				{
					delete this->w_arr[i];
					this->w_arr[i] = NULL;
				}
				delete []this->w_arr;   //删除并置空堆区数组指针
				this->w_arr = NULL;
			}
			//初始化属性
			this->Num = 0;
			this->fileIsEmpty = true;
			cout<<"文件清空成功!"<<endl;
		}
	}
	//按任意键后清屏
	system("pause");
	system("cls");
}

WorkerManager::~WorkerManager()
{
	//释放堆区内存
	if(this->w_arr != NULL)
	{
		for(int i=0;i<this->Num;i++)  //将每个元素都置空
		{
			delete this->w_arr[i];
			this->w_arr[i] = NULL;
		}
		delete []this->w_arr;   //删除并置空堆区数组指针
		this->w_arr = NULL;
	}
}

本文的项目工程文件:点此下载


本文参考视频:
黑马程序员匠心之作|C++教程从0到1入门编程,学习编程不再难

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1431649.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

flask_django_python五金电商网络营销的可视化分析研究

前面部分完成了系统需求分析&#xff0c;了解到新闻数据业务方面的需求&#xff0c;系统主要分为用户管理、五金信息管理、在线留言、系统管理等功能。销的可视化研究&#xff0c;并对这些数据进行处理&#xff0c; 然后对这些数据进行可视化分析和统计。 Python 爬虫技术目前来…

职言圈:华为4年员工,小金库存到100万,但却在事业上升期决定回老家县城考公务员。

“华为4年员工&#xff0c;小金库存到100万&#xff0c;但却在事业上升期决定回老家县城考公务员。只因不想现在赚的钱将来都花在了医院&#xff01;” 互联网大厂员工的薪资高&#xff0c;这是人尽皆知的事了&#xff0c;特别是像华为、百度、绿厂、阿里、鹅厂等这些知名公司…

Leetcode的AC指南 —— 栈与队列 :1047.删除字符串中的所有相邻重复项

摘要&#xff1a; **Leetcode的AC指南 —— 栈与队列 &#xff1a;1047.删除字符串中的所有相邻重复项 **。题目介绍&#xff1a;给出由小写字母组成的字符串 S&#xff0c;重复项删除操作会选择两个相邻且相同的字母&#xff0c;并删除它们。 在 S 上反复执行重复项删除操作&a…

CG-FS 风速传感器 485型三杯式风速计 气象环境监测仪器

产品概述 本产品主要采用优质聚合物碳纤维为原材料&#xff0c;具有良好的防腐、防侵蚀等特点&#xff0c;能够保证仪器长期使用不起锈&#xff0c;同时配合内部顺滑的轴承系统&#xff0c;确保了信息采集的准确性。外型小巧轻便&#xff0c;便于携带和组装&#xff0c;三杯设…

计划赶不上变化!项目团队如何高效管理变更请求?

现实中&#xff0c;即使是计划得再好的项目&#xff0c;有时也需要变更。作为项目经理&#xff0c;管理变更请求是重要的工作之一&#xff0c;以便团队能继续无缝工作&#xff0c;实现项目目标。 变更请求的重要性 变更请求是指修改系统、产品或项目计划的建议&#xff0c;通常…

计算机网络_1.6.1 常见的三种计算机网络体系结构

1.6.1 常见的三种计算机网络体系结构 1、OSI&#xff08;七层协议&#xff09;标准失败的原因2、TCP/IP参考模型3、三种网络体系结构对比 笔记来源&#xff1a; B站 《深入浅出计算机网络》课程 1、OSI&#xff08;七层协议&#xff09;标准失败的原因 &#xff08;1&#xf…

利用ReentrantLock解决死锁----以哲学家问题为例

问题描述 哲学家问题&#xff1a;其中多个哲学家在共享有限资源&#xff08;筷子&#xff09;的情况下进行工作&#xff08;思考和吃饭&#xff09;&#xff0c;这可能导致死锁。 每位哲学家需要两根筷子才能吃饭&#xff0c;而每根筷子只能被一位哲学家使用&#xff0c;这就…

Web项目利用OSS进行图像存储服务

一、OSS介绍 在Web项目中&#xff0c;一些常见的功能&#xff0c;比如展示图片&#xff0c;修改头像等&#xff0c;都需要进行图片的上传操作&#xff0c;但是如果是存储在Web服务器中&#xff0c;在读取图片的时候会占用比较多的资源&#xff0c;影响服务器的性能。 常…

学习c语言,动态内存管理

malloc和calloc区别在于初始化

迅为RK3588开发板windows与开发板互传使用U盘进行拷贝

1 将 U 盘(U 盘的格式必须为 FAT32 格式&#xff0c;大小在 32G 以下)插到开发板的 usb 接口&#xff0c;串口打印信息如下所示&#xff0c;U 盘的设备节点是/dev/sdb4。U 盘的设备节点不是固定的&#xff0c;根据实际情况来查看设备节点。 2 输入以下命令挂载 U 盘&#xff0c…

2024年教资认定全流程详细图解✅

教资认定3月开始&#xff0c;大家别只顾着快乐过年&#xff0c;可以做好准备了&#xff01; ▶️材料准备&#xff1a; 有效期内的身份证原件学历证学位证普通话等级证书电子版个人照片&#xff08;个人近期白底免冠无头饰正面1寸证照。&#xff09;打印版填写完毕的个人承诺书…

感激沃尔玛跨境智星:轻松注册大量沃尔玛买家号的利器

最近&#xff0c;我急需大量沃尔玛买家号&#xff0c;但又担心账号之间可能存在关联问题。幸运的是&#xff0c;在我尝试使用沃尔玛跨境智星后&#xff0c;这一问题得到了解决。 首先&#xff0c;我要感谢这款软件提供的详细操作指南。通过访问沃尔玛官网并按照您的指引&#x…

【蓝桥杯冲冲冲】[NOIP2001 普及组] 装箱问题

蓝桥杯备赛 | 洛谷做题打卡day26 文章目录 蓝桥杯备赛 | 洛谷做题打卡day26题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 提示思路 题解代码我的一些话 [NOIP2001 普及组] 装箱问题 题目描述 有一个箱子容量为 V V V&#xff0c;同时有 n n n 个物品&#xff0c;每…

c++虚函数、静态绑定与动态绑定

首先说明&#xff0c;所谓绑定&#xff0c;就是指函数的调用 接下来&#xff0c;我们直接看一段代码来说明问题 class Base { public:Base(int data10):m_a(data){}void show(){cout<<"Base::show()"<<endl;}void show(int){cout<<"Base::sh…

引流技术-通过文件中增加联系方式并传播

文章目录 前言文档增加联系方式扩散网盘扩散自建网站借力 注意 前言 很多人在找资料的时候可能都遇到过下图情况&#xff1a; 1、文档最后面留一个自己的联系方式&#xff1b; 2、找的一堆文件中都有相同的情况&#xff1b; 3、一段时间全网搜到的很多相同文件也有这个联系方式…

springboot156基于SpringBoot+Vue的常规应急物资管理系统

基于SpringBootVue的常规应急物资管理系统的设计与实现 摘 要 1 ABSTRACT 2 第一章 绪论 3 1.1研究背景 3 1.2研究意义 3 1.3国内外研究现状 4 1.3.1国外研究现状 4 1.3.2国内研究现状 4 1.4研究内容与方法 5 1.4.1研究内容 5 1.4.2研究方法 5 1.5论文的组织结构 5…

3D力导向树插件-3d-force-graph学习002

一、实现效果&#xff1a;节点文字同时展示 节点显示不同颜色节点盒label文字并存节点上添加点击事件 二、利用插件&#xff1a;CSS2DRenderer 提示&#xff1a;以下引入文件均可在安装完3d-force-graph的安装包里找到 三、关键代码 提示&#xff1a;模拟数据可按如下格式填…

年终奖,还得是腾讯。。。

腾讯年终奖 什么是真正的好公司&#xff1f; 一年到头&#xff0c;出不了几次裁员等劳务纠纷的吃瓜新闻。 只有到年底了&#xff0c;才因为年终奖远高于行业水平&#xff0c;实在没法低调了&#xff0c;"被迫"上热搜。 最近网友爆料了腾讯头牌部门的年终奖&#xff1…

GPT用来润色论文\生成完整长篇论文\进行AI绘图,真的太香了!

详情点击公众号&#xff1a;技术科研吧 链接&#xff1a;GPT用来润色论文\生成完整长篇论文\进行AI绘图&#xff0c;真的太香了&#xff01; 一&#xff1a;AI领域最新技术 1.OpenAI新模型-GPT-5 2.谷歌新模型-Gemini Ultra 3.Meta新模型-LLama3 4.科大讯飞-星火认知 5.百…

C# CAD界面-自定义工具栏(二)

运行环境 vs2022 c# cad2016 调试成功 一、引用 acdbmgd.dllacmgd.dllaccoremgd.dllAutodesk.AutoCAD.Interop.Common.dllAutodesk.AutoCAD.Interop.dll using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.T…