C++新手职工管理系统总结

本文介绍了C++中类的封装与文件操作技巧,包括在头文件中定义函数、使用系统类管理操作、构造函数负责初始化文件和成员变量,析构函数负责内存释放,以及如何处理文件存在、为空和空间扩展的情况。

1、每个类写在专门的头文件内,头文件只进行函数的定义,具体实现写在对应的cpp文件内,此时要注意作用域的声明

就拿manager类举例:

manager.h类中用来进行函数的定义,即对父类虚函数的重写。

实现则在manager.cpp中实现

此时要注意需要引用对应的头文件。

2、对于系统的操作,定义一个系统类,对应操作写在系统类的成员函数中

如上文图片显示,创建了一个workerManager.h文件,里面均是系统操作的一些定义

3、系统类的构造函数一般用来进行对文件的操作和对类成员变量的初始化

WorkerManager::WorkerManager(){
	ifstream ifs;
	ifs.open(FileName, ios::in);
	//如果文件不存在
	if (!ifs.is_open()) {
		//cout << "文件不存在" << endl;
		this->m_EmpNum = 0;
		this->m_EmpArray = NULL;
		this->m_FileIsEmpty = true;
		ifs.close();
		return;
	}
	//文件存在但是为空
	char ch;
	ifs >> ch;
	if (ifs.eof()) {
		//cout << "文件为空" << endl;
		this->m_EmpNum = 0;
		this->m_EmpArray = NULL;
		this->m_FileIsEmpty = true;
		ifs.close();
		return;
	}
	//文件存在且不为空
	int num = this->get_EmpNum();
	//cout << "职工人数为" << num << "人" << endl;
	this->m_EmpNum = num;
	this->m_FileIsEmpty = false;
	//开辟空间
	this->m_EmpArray = new Worker * [this->m_EmpNum];
	//将文件中的数组读入数组
	this->init_Emp();
}

4、系统类的析构函数则用来对堆区申请空间的释放操作,存在二级指针的情况下,要先把它对应的一级指针删除完,再删除二级指针。

WorkerManager::~WorkerManager(){
	if (this->m_EmpArray != NULL) {
		for (int i = 0; i < this->m_EmpNum; i++) {
			if (this->m_EmpArray[i] != NULL) {
				delete this->m_EmpArray[i];
			}
		}
	}
	delete[] this->m_EmpArray;
	this->m_EmpArray = NULL;
}

5、当前空间不够时,要开辟新的空间,之后需要将旧内容拷贝到新空间内,然后释放旧空间,同时改变指针的指向

void WorkerManager::Add_Emp(){
	cout << "请输入添加员工的数量:" << endl;
	int addNum = 0;
	cin >> addNum;
	if (addNum > 0){
		//添加
		//计算添加后的空间大小
		int newSize = this->m_EmpNum + addNum;
		//开辟新空间
		Worker** newSpace = new Worker * [newSize];
		//将原来空间下的数据拷贝到新空间内
		if (this->m_EmpArray != NULL) {
			for (int i = 0; i < this->m_EmpNum; i++) {
				newSpace[i] = this->m_EmpArray[i];
			}
		}
		//开始添加新的数据
		for (int i = 0; i < addNum; i++) {
			int id;
			string name;
			int did;
			cout << "请输入第" << i + 1 << "个新职工的编号:" << endl;
			cin >> id;
			cout << "请输入第" << i + 1 << "个新职工的姓名:" << endl;
			cin >> name;
			cout << "请输入第" << i + 1 << "个新职工的部门岗位:" << endl;
			cout << "1、员工" << endl;
			cout << "2、经理" << endl;
			cout << "3、老板" << endl;
			cin >> did;

			Worker *worker = NULL;
			switch (did)
			{
			case 1:
				worker = new Employee(id, name, did);
				break;
			case 2:
				worker = new Manager(id, name, did);
				break;
			case 3:
				worker = new Boss(id, name, did);
				break;
			}
			//将创建后的指针保存到新数组内
			newSpace[this->m_EmpNum + i] = worker;
		}
		//释放原有的空间
		delete[] this->m_EmpArray;
		//更改新空间指针的指向
		this->m_EmpArray = newSpace;
		//更新职工数量
		this->m_EmpNum = newSize;
		//提示添加成功
		cout << "成功添加" <<addNum<<"名新职工"<< endl;
		//更新职工不为空标志
		this->m_FileIsEmpty = false;
		//保存到文件中
		this->save();
	}
	else {
		cout << "输入数据有误!" << endl;
	}
	//按任意键清屏
	system("pause");
	system("cls");
}

6、.isopen()用来判断是否存在文件,.eof()用来判断文件是否为空。

7、ofstream每次以ios::out进行写操作时,会清空所有内容再进行写入操作。

8、从文件中读取数据时,需要先知道读入数据的大小以便于开辟堆区中的空间,之后进行数据拷贝的工作。

9、按任意键清屏

system("pause");
system("cls");

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值