企业管理系统做了接近4天,能够明显感觉到自己的能力提升了,很多以前根本想不到的代码,在这次项目里都自主地用上了。
在这里我要记录一下这个项目哪些地方对我自身知识库的更新:
1、在数据库造表的时候,需要添加default charset=utf8,才能够在表中正确显示中文信息。e.g.:table xxx1(name char(20))default charset=utf8;
2、在基类函数person中,首先在基类的构造函数中对每个私有成员进行初始化(拷贝函数是赋值),然后写了4个纯虚函数:
a、计算工资 calssalary
b、从数据库下载得到工资后对容器进行初始化工资setsalary
c、奖罚员工使用的函数,在四个分类中 “ 重写 ” 实现award
d、在查询员工信息时使用的output
最后对company “友元”,使company能够访问person中的所有成员和函数。
3、在company类中写了一个私有成员向量容器vector
a、 包含头文件
cin.clear(); //改变cin的状态标识符
cin.ignore(10,'\n'); //忽略10个字符,遇到\n结束忽略。 cin.sync()每次只忽略一个字符。
b、在建立每一个vector成员时,首先需要明白vector的成员是一个person型的指针变量,所以vector里的每一个成员装的是不同类的但是继承于person类的子类成员。先创建一个类person *per;再根据duty的不同new一个与duty吻合的子类:per = new manage(……)。创建成功后计算相应工资,用worker.push_back(per)装入容器中。
c、在删除成员时,for(int i = 0; i < worker.size(); i++)循环遍历容器进行id的匹配,用worker.erase(worker.begin()+i)进行成员删除。在删除一个员工时他的编号会被保存,此时容器的size就会变少,当遍历时就会少一个人,此刻就需要查找编号最大的那一个,然后进行添加成员(在最大编号的基础上)。
d、在对员工信息进行修改时,涉及到文件的操作,包含头文件
ofstream("text.txt",ios::app) // 对文件进行追加写入
fout << "……"; //即可讲……输入到text.txt文件中
补充:ios::app 添加到文件尾
ios::ate 把文件标志放在末尾而非起始。
ios::trunc 默认. 截断并覆写文件。
ios::nocreate 文件不存在也不创建。
ios::noreplace 文件存在则失败。
详情见http://www.cnblogs.com/yingying0907/archive/2012/08/17/2643489.html
e、修改级别的时候,需要创建一个新的与级别对应的空间保存到容器中,把当前的数据放倒新的new中,然后删除当前空间。
f、查询信息:按编号顺序查询,用for循环i++与id进行匹配,使员工按编号输出。按级别查询,用了四次for循环一一输出每个级别信息。还可以按级别查询……
g、用迭代器把容器中的信息保存到数据库中,关键代码如下:
```
vector::iterator i = worker.begin();
while(i != worker.end())
{
sprintf(buff,"%s%d,'%s', '%s' , %d, %lf)",buf,
(*i)->Id,
(*i)->Name,
(*i)->Passwd,
(*i)->Duty,
(*i)->Earning
);
mysql_query(conn,buff);
i++;
}
```
h、把mysql的信息保存到容器中,关键代码如下:
while( (row = mysql_fetch_row(res)) != NULL )
{
id++;
switch(atoi(row[3]))
{
case 1:per = new Manage(atoi(row[0]), row[1], row[2], atoi(row[3]));
per->SetSalary(atoi(row[4]));
break;
case 2:per = new SaleManager(atoi(row[0]), row[1], row[2], atoi(row[3]),0);
per->SetSalary(atoi(row[4]));
break;
case 3:per = new Technician(atoi(row[0]), row[1], row[2], atoi(row[3]),0);
per->SetSalary(atoi(row[4]));
break;
case 4:per = new Sales(atoi(row[0]), row[1], row[2], atoi(row[3]),0);
per->SetSalary(atoi(row[4]));
break;
}
worker.push_back(per);
}
i、在登陆界面,也需要下载数据库,判断员工编号和密码进行登录,完成三次错误登录退出登录并等待6秒,这里用到
void delay_msec(int msec)
{
clock_t now = clock();
clock_t d; cout << "6秒后重新登陆……" << endl;
while(clock() - now < msec) {}
}
在调用此函数时,delay_msec(6000000) 可完成延时6秒。