一开始看到题目这么长,差点就不想写了,而且感觉会很麻烦,但是最后想想,要有始有终,还是耐着性子写了下来,果然很麻烦的说~~~
但是还是写了,这样,到时候有人来到这里就不会出现找不到题目的问题!
ee.cpp
#include <iostream>
#include <string>
#include <fstream>
using namespace std;
static enum{Emp,Employee,Manager,Fink,Highfink};
//不能写成小写的emp,否则在main175中无法创建对应的对象
static void eatLine()
{
while(cin.get()!='\n')
continue;
};
class emp
{
private:
string fname;
string lname;
string job;
public:
emp(){
fname="fdefault";
lname="ldefault";
job="jdefault";
}
emp(const string &fn,const string &ln,const string &j){
fname=fn;
lname=ln;
job=j;
}
virtual void Data(ofstream &fout){//标记
fout<<Emp<<endl;
};
virtual void save(ofstream &fout){
Data(fout);
fout<<fname<<endl;
fout<<lname<<endl;
fout<<job<<endl;
};//保存到文本
//读取文本
virtual void getall(ifstream &fin)
{
fin>>fname;
fin>>lname;
fin>>job;
}
virtual void speciality()const=0
{
cout<<"this is emp:"<<endl;
}
virtual void showAll()const
{
speciality();//用于区分
cout<<"fullname:"<<fname<<" lastname:"<<lname<<" job:"<<job<<endl;
}
virtual void setAll()
{
//eatLine();//清除前面的输入
speciality();
cout<<"\nPlease enter the fullname:";
//string ffname;//应该直接赋值给fname
//getline(cin,fname);
//eatLine();
cin>>fname;
cout<<"\nPlease enter the lastname:";
//string llname;
//getline(cin,lname);
cin>>lname;
cout<<"\nPlease enter the job:";
//string llname;
//getline(cin,job);
cin>>job;
//eatLine();
}
friend ostream&operator<<(ostream &os,const emp &e)
{
e.showAll();//调用成员函数搞定
return os;
}
virtual ~emp(){}
};
class employee:public emp
{
public:
employee(){};
employee(const string &fn,const string &ln,const string &j):emp(fn,ln,j){};
virtual void speciality()const
{
cout<<"this is employee:"<<endl;
}
virtual void setAll()
{
emp::setAll();
}
virtual void showAll()const
{
//speciality();//这里无需调用,因为上一层已经调用过
emp::showAll();
}
virtual void Data(ofstream &fout){//标记
fout<<Employee<<endl;
};
virtual void save(ofstream &fout){
emp::save(fout);//没有新元素
};//保存到文本
virtual void getall(ifstream &fin)
{
emp::getall(fin);
//fin>>fname>>lname>>job;
}
};
class manager:virtual public emp
{
private:
int inchargeof;
protected:
int InChargeOf()const{return inchargeof;};
int &InChargeOf(){return inchargeof;};
void setI(int i)//设置inchargeof
{
inchargeof=i;
}
public:
manager(){};
manager(const string &fn,const string &ln,const string &j,int c=0):emp(fn,ln,j),inchargeof(c){};
manager(const emp &e,int ico):emp(e),inchargeof(ico){};
manager(const manager &m):emp(m){
inchargeof=m.inchargeof;
}
virtual void speciality()const
{
cout<<"This is manager:"<<endl;
}
virtual void showAll()const{
emp::showAll();
cout<<"inchargeof:"<<inchargeof<<endl;
};
virtual void setAll()
{
emp::setAll();
cout<<"Enter the inchargeof:";
//int n;
cin>>inchargeof;
eatLine();
}
virtual void Data(ofstream &fout){//标记
fout<<Manager<<endl;
};
virtual void save(ofstream &fout){
emp::save(fout);
fout<<inchargeof<<endl;
};//保存到文本
virtual void getall(ifstream &fin)
{
emp::getall(fin);
fin>>inchargeof;
//fin>>fname>>lname>>job;
}
};
class fink:virtual public emp
{
private:
string reportsto;
protected:
const string ReportsTo()const {return reportsto;};
string &ReportsTo(){return reportsto;};
void setRe(string str)
{
reportsto=str;
}
public:
fink(){};
fink(const string &fn,const string &ln,const string &j,const string &rpo):emp(fn,ln,j),reportsto(rpo){}
fink(const emp &e,const string &rpo):emp(e),reportsto(rpo){}
fink(const fink &e):emp(e)
{
reportsto=e.reportsto;
}
virtual void speciality()const
{
cout<<"this is fink:"<<endl;
}
virtual void showAll()const
{
emp::showAll();
cout<<"Reportsto:"<<reportsto<<endl;
}
virtual void setAll()
{
emp::setAll();
cout<<"Enter the reportsto:";
//int n;
//getline(cin,reportsto);
cin>>reportsto;
eatLine();
//eatLine();
}
virtual void Data(ofstream &fout){//标记
fout<<Fink<<endl;
};
virtual void save(ofstream &fout)
{
emp::save(fout);
fout<<reportsto<<endl;
};//保存到文本
virtual void getall(ifstream &fin)
{
emp::getall(fin);
fin>>reportsto;
}
};
class highfink:public manager,public fink
{
public:
highfink(){};
highfink(const string &fn,const string &ln,const string &j,const string &rpo,int ico)
:emp(fn,ln,j),manager(fn,ln,j,ico),fink(fn,ln,j,rpo){}
highfink(const emp &e,const string &rpo,int ico)
:emp(e),manager(e,ico),fink(e,rpo){}//注意这个构造是怎么构造的
highfink(const fink &f,int ico)
:emp(f),fink(f),manager(f,ico){}//这样行不行呢?
highfink(const manager &m,const string &rpo)
:emp(m),manager(m),fink(m,rpo){}
highfink(const highfink &h)
:emp(h),manager(h),fink(h){}//这样可否??
virtual void speciality()const//const必须与emp一致,否则会隐藏原来的,而不是重载
{
cout<<"This is highfink:"<<endl;
}
virtual void showAll()const//注意大小写不要写错了
{
//out<<"here is !"<<endl;
emp::showAll();
cout<<"Inchargeof:"<<InChargeOf()<<" ";
cout<<"Reportsto:"<<ReportsTo()<<endl;
/*manager::showAll();
fink::showAll();*/
}
virtual void setAll()
{
emp::setAll();
cout<<"Enter the inchargeof:";
int incharge;
cin>>incharge;
cin.get();//吃掉\n
setI(incharge);
cout<<"Enter the reportsto:";
string res;
cin>>res;
setRe(res);
/*
manager::setAll();
fink::setAll();*/
}
virtual void getall(ifstream &fin)
{
emp::getall(fin);
int i;
fin>>i;
setI(i);
string str;
fin>>str;
setRe(str);
}
virtual void Data(ofstream &fout){//标记
fout<<Highfink<<endl;
};
virtual void save(ofstream &fout){//要特殊处理
emp::save(fout);
//Data(fout);
int n=InChargeOf();
fout<<n<<endl;
string str=ReportsTo();
fout<<str<<endl;
};//保存到文本
};
main176.cpp
//没有按照他说的那个命令行参数,因为觉得不用打开多个文件
#include <iostream>
#include "ee.cpp"
#include <fstream>
#include <cstdlib> //for exit
using namespace std;
static const int MAX=1;
//int main(int argc,char *argv[])
int main()
{
emp *pc[MAX];
ofstream fout;
ifstream fin("data.txt");
if(!fin.is_open())
{
cout<<"FIN fail"<<endl;
return 0;
}
//show
char s;
emp *p;
while(!fin.eof()&&fin.good()){
fin>>s;
if(s=='\n')
break;//如果到了最后一个换行
switch(s)
{
case '1':p=new employee;
break;
case '2':p=new manager;
break;
case '3':p=new fink;
break;
case '4':p=new highfink;
break;
default:;break;
}
p->getall(fin);
p->showAll();
cout<<endl<<endl;
}
fin.close();
//先读取,再写入
fout.open("data.txt",ios_base::app);//原来是二进制文件无法追加
//||ios_base::binary);
if(!fout.is_open())
{
cout<<"Open fail!"<<endl;
eatLine();
return 1;
}
char ch='0';
int i=0;
while(ch!='q'&&i<MAX)
{
cout<<"Please enter the choice (q to quit):"<<endl
<<"1.employee 2.manager"<<endl
<<"3.fink 4.highfink"<<endl;
cin>>ch;
switch(ch)
{
case '1':pc[i]=new employee;
break;
case '2':pc[i]=new manager;
break;
case '3':pc[i]=new fink;
break;
case '4':pc[i]=new highfink;
break;
default:;break;
}
//eatLine();
cin.get();
pc[i]->setAll();
pc[i]->showAll();
pc[i]->save(fout);
fout.flush();
i++;
}
fout.close();
cin.get();
return 0;
}