C++职工管理系统总结

C++职⼯管理系统总结
提⽰:本⽂记录了学习完C++之后使⽤⼀个“职⼯信息管理系统”训练的感想和总结。
基于C++的职⼯信息管理系统总结
⼀、项⽬的总体架构
本项⽬是对职⼯的信息进⾏记录,并通过⽂件的读写操作将数据保存在⽂本⽂件中,⽅便以后查看。规划了⼀个Manage类,⽤来对信息的输⼊、显⽰、删除、查等功能进⾏实现,⽽具体的员⼯⽅⾯,由于员⼯只是所在岗位有区别,其他的信息如年龄、姓名等都⼀样,所以可以使⽤继承和多态的思想,创建⼀个Workman类,作为员⼯类的抽象类(基类),⽽具体的员⼯如:⼤⽼板、⼩⽼板、普通员⼯等可以继承基类实现。
在Manage类中,建⽴⼀个Workman类型的⼆级指针,⽤来作为数组存放公司的每⼀个员⼯。在这⾥,之所以使⽤⼆级指针,是因为数组中只能存放类型⼀致的元素,但是职员类型分为三种:⼤⽼板、⼩⽼板、普通员⼯,所以必须⽤他们的指针进⾏存放。⽽他们的指针都是继承的基类Workman,因此可以存放到⼀个⼆维数组中。在系统中添加新员⼯时,可以根据待添加的员⼯类型,在堆区new出⼀个同样类型的数据,并保存到上述的⼆维数组中。
⼆、关键代码
1.创建空间及内存拷贝
代码如下:
//更新公司中总的⼈数
int old_num =this->workers_num;
int new_num = old_num + in_num;
this->workers_num = new_num;
//为新成员开辟新空间
if(this->Workers_arr !=NULL)
{
Workman** tmp_workers =new Workman *[new_num];//重新分配空间
/
/注意:memcpy函数中第三个参数必须为 sizeof(Workman*) ⽽不可以是sizeof(Workman),否则会带来错误!
memcpy(tmp_workers,this->Workers_arr,(old_num)*sizeof(Workman*));//复制原数组数据
医疗设备结构设计//for (int i = 0; i < old_num; i++)
//{
// tmp_workers[i] = this->Workers_arr[i];  //本段循环⽤来替代memcpy函数
//}
delete[]this->Workers_arr;//释放原有空间
this->Workers_arr = tmp_workers;//重新更新指针指向
}
else
{
this->Workers_arr =new Workman *[new_num];//空数组直接创建空间
}
2.析构函数实现内存的回收大家语文博客网
代码如下:
Manage::~Manage()
{
cout <<"Manage析构函数调⽤!"<< endl;
//if (this->Workers_arr != NULL)  //这种⽅式仅仅将堆区的数组指针释放了,没有将⽤户创建的每⼀个堆区对象释放!是不合理的!
//{
// delete[] this->Workers_arr;
// this->Workers_arr = NULL;
//}
for(int i =0; i <this->workers_num; i++)//堆区内存释放
{
if(this->Workers_arr[i]!=NULL)//如果数据不为空
{
delete this->Workers_arr[i];//先释放每⼀个堆区的对象
this->Workers_arr[i]=NULL;
}
}
delete[]this->Workers_arr;//再释放堆区数组
this->Workers_arr =NULL;
}
注意在析构函数中实现内存回收时,⼀定要注意深浅拷贝的问题!!。
三、调试过程中的相关问题
1.编译器报错:访问权限冲突:this指针是0xCCCCCCCC或是:0xCDCDCDCD
这种错误在百度上可以查到很多条相关信息,具体的原因就是指针的内存出错,要么就是使⽤了没有进⾏初始化的指针,或者是结构体等,必须要仔细查看程序中是否有指针创建出来后,程序员没有new出⼀⽚空间给这个指针分配内存!
我在debug时,出现了好多次这⼀问题:
原因就在于我直接加载了下⾯的Get_info()函数,⽽此时this->Workers_arr只是被定义了,⽽没有⼿动为他开辟内存空间,从⽽带来上述报错!
//重新加载⽂本中已有的数据
void Manage::Get_info()
有效部位{
string tmp;
int line_num =1;//⾏数
int count =0;
集里中学string id;
string name;
string age;
string sex;
string department;//1 ⼤⽼板  2 ⼩⽼板 3 员⼯
Workman* tmp_worker =NULL;//临时变量在程序结束后系统⾃动释放,不⽤⼿动delete
ifstream ifs;
ifs.open(FILENAME, ios::in);
while(ifs >> name && ifs >> id && ifs >> sex && ifs >> age && ifs >> department)
{
if(department =="⼤⽼板")
tmp_worker =new BigBoss(id, name,String_to_short(age.c_str()),(sex =="男"?0:1),1);
else if(department =="⼩⽼板")
夫承子液Htmp_worker =new SmallBoss(id, name,String_to_short(age.c_str()),(sex =="男"?0:1),2);
else
tmp_worker =new Employee(id, name,String_to_short(age.c_str()),(sex =="男"?0:1),3);
this->Workers_arr[count++]= tmp_worker;
}
ifs.close();
}
正确的⽅法:必须先为this->Workers_arr开辟空间,再调⽤Get_info()函数:
//为原有数据分配空间
this->Workers_arr =new Workman *[num];
//将⽂本中的数据加载到系统内存中
this->Get_info();
2.使⽤函数memcpy进⾏内存复制带来的运⾏错误
函数memcpy是C++中在 string.h 中(C++是 cstring)声明的函数。
函数原型:
void *memcpy(void *destin, void *source, unsigned n);
作⽤:
以source指向的地址为起点,将连续的n个字节数据,复制到以destin指向的地址为起点的内存中。
函数有三个参数,第⼀个是⽬标地址,第⼆个是源地址,第三个是数据长度。
注意事项:
数据长度(第三个参数)的单位是字节(1byte = 8bit)。
该函数有⼀个返回值,类型是void*,是⼀个指向destin的指针。
使⽤这⼀函数务必确保第三个参数(待复制第⼆个数据)的长度,否则会带来内存泄漏!
这⾥我原来使⽤的代码:
memcpy(tmp_workers,this->Workers_arr,(old_num)*sizeof(Workman));//复制原数组数据
运⾏时总会出现意外的错误,因为有时候添加⼈员时没有问题,但是有时候会出现意想不到,摸不到头脑的错误,排查了好久后发现:tmp_workers是⼀个Workman**类型的指针,在拷贝数据的时候,必须拷贝类型相同的字节长度,因此修改为:
memcpy(tmp_workers,this->Workers_arr,(old_num)*sizeof(Workman**));
ire之后,问题就得到了解决!
使⽤memcpy函数时,特别要注意数据长度。
如果复制的数据类型是char,那么数据长度就等于元素的个数。⽽如果数据类型是其他(如int, double, ⾃定义结构体等),就要特别注意数据长度的值。
好的习惯是,⽆论拷贝何种数据类型,都⽤ n * sizeof(type_name)的写法。
四、C++项⽬中⽂件管理经验
1. 对于⾃定义的头⽂件要使⽤双引号包含;⽽对于系统给定的头⽂件要使⽤<>进⾏包含
2. 先创建⼀个main.cpp⽂件,作为程序的核⼼代码(可以更换为其他的名字,中⽂也可!)
3. 对于每⼀个类,创建⼀个.cpp和.h⽂件,类的声明(及内部的成员函数和成员变量)都放在.h⽂件中,⽽类的具体函数实现需要
在.cpp⽂件中进⾏。
4. **需要注意的是,**由于类的声明和实现不在同⼀个⽂件中进⾏,因此在对⾃⼰写的源⽂件(.cpp中)成员函数进⾏具体实现时,必须
加上作⽤域:即类型::。
5. 在⾃⼰写的类中,对⾃⼰写的源⽂件(.cpp中)成员函数进⾏具体实现时,如果需要调⽤到该类的其他成员变量及成员函数,必须使
⽤this指针指向这⼀变量或函数,如:this->name等。
6. **注意:**在每⼀个⾃⼰写的.h下,都要包含iostream.h和using namespace std;
五、总结
代码的经验必须多写才能总结,之前我⼀直⽐较懒,以为看看书就可以了,现在才发现必须要多动⼿实践才可以将知识转换为实际!加油吧!
具体的⼯程⽂件代码详见我的博客C++专栏。

本文发布于:2024-09-21 12:43:21,感谢您对本站的认可!

本文链接:https://www.17tex.com/xueshu/97018.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:数据   函数   指针   内存   类型
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议