#include <iostream>
#include <string>
using namespace std;//类employ                                                               
class employ
{                                                             
public:
int age;                                                           
std::string name;                                                     
std::string job;                                                      
int number;double monthpay;std::string gender;
employ(){}
    employ(int n,int a,int g,int j,string na);                                              
void setgender(int g);                                                 
void setjob(int j);                                                  
virtual void pay(){}
virtual void showdata(){}
};//类technician
class technician:public employ{
public:
double time;double payrate;
technician(){}
technician(int n,int a,int g,int j,string na);
void pay();
void showdata();
};
//类manager
class manager:virtual public employ{
public:
double salary;
manager(){}
manager(int n,int a,int g,int j,string na);
virtual void pay();
virtual void showdata();
};//类sales
class sales:virtual public employ{
public:
double sale;double payrate;
sales(){}
sales(int n,int a,int g,int j,string na);
virtual void pay();
virtual void showdata(); 
};
//类salesmanager
class salesmanager:public manager,public sales{
public:
double salesum;
salesmanager(){}
salesmanager(int n,int a,int g,int j,string na);
void pay();
void showdata();                                                       
};                                                                      //定义employ
employ::employ(int n,int a,int g,int j,string na):number(n),name(na),age(a)
{
setjob(j);
setgender(g);
}void employ::setgender(int g)
{
if(g==1)
gender="man";
else if(g==2)
gender="woman";
else cout<<"error!!!"<<endl;
}void employ::setjob(int j)
{
if(j==1)
job="manager";
else if(j==2)
job="salesmanager";
else if(j==3)
job="technician";
else if(j==4)
job="salesman";
else cout<<"error!!!"<<endl;
}//定义manager
manager::manager(int n,int a,int g,int j,string na):employ(n,a,g,j,na)
{salary=8000;}void manager::pay()
{monthpay=salary;}void manager::showdata()
{cout<<number<<"  "<<name<<"  "<<gender<<"  "<<age<<"  "<<job<<"  "<<monthpay<<endl;}//定义technician
technician::technician(int n,int a,int g,int j,string na):employ(n,a,g,j,na)
{payrate=100;}void technician::pay()
{
cout<<"Please input you worktime:";
cin>>time;monthpay=time*payrate;}
void technician::showdata(){cout<<number<<"  "<<name<<"  "<<gender<<"  "<<age<<"  "<<job<<"  "<<monthpay<<endl;}//定义sales
sales::sales(int n,int a,int g,int j,string na):employ(n,a,g,j,na)
{payrate=0.04;}void sales::pay()
{cout<<"please put in your sales:"<<endl;cin>>sale;monthpay=sale*payrate;}void sales::showdata()
{cout<<number<<"  "<<name<<"  "<<gender<<"  "<<age<<"  "<<job<<"  "<<monthpay<<endl;}
//定义salesmanager
salesmanager::salesmanager(int n,int a,int g,int j,string na):employ(n,a,g,j,na)
{salary=5000;payrate=0.005;}void salesmanager::pay(){cout<<"put in salessum: ";cin>>salesum;monthpay=salary+salesum*payrate;}void salesmanager::showdata()
{cout<<number<<"  "<<name<<"  "<<gender<<"  "<<age<<"  "<<job<<"  "<<monthpay<<endl;}
class  Node
{
public:
employ & emp;
Node * next, *prev;
Node(employ & e):emp(e),next(0),prev(0){}
protected:
private:
};class employList
{
public:
    employList():first(0),size(0){}
Node * getFirst() const {return first;}
int getSize() const {return size;}
void add(employ & e);
void remove(int num);
void find(int num) const;
void display() const;
~employList();
protected:
private:
int size;
Node * first;
};void employList::add(employ & e)
{
Node * pN= new Node(e);
if(first)
{
pN->next = first;
first->prev = pN;
}
first = pN;
size++;
}void employList::remove(int num)
{
for(Node* p=first;p;p->next)
if((p->emp).number==num)
{
if(p->prev) p->prev->next = p->next;
if(p->next) p->next->prev = p->prev;
if(p==first) first = p->next;
delete p;
size--;
break;
}
}void employList::display()const
{
cout<<"There are "<<size<<"employee.\n";
for(Node *p=first;p;p=p->next)
(p->emp).showdata();
}employList::~employList()
{
for(Node* p=first;p=first;delete p)
first = first->next;
}void employList::find(int num)const
{
for(Node *p=first;p;p=p->next)
if((p->emp).number==num)
(p->emp).showdata();
else cout<<"No information!\n";
}
class menu
{
public:
int menu1();
void addin(employList &empl);
protected:
private:
};void menu::addin(employList &empl)
{

int n,a,g,j;
std::string na;
cout<<"please put in the number:\n";
cin>>n;

cout<<"please put in the name:\n";
cin>>na;

cout<<"please choose the gender:\n";
cout<<"1. man or 2. woman"<<endl;
cin>>g;

cout<<"please put in the age:\n";
cin>>a;


cout<<"please choose the job:\n";
cout<<"1. manager or 2. salesmanager or 3. technician or 4. salesman "<<endl;
cin>>j;


if(j==1)
{manager  newworker1(n,a,g,j,na);
newworker1.pay();
empl.add(newworker1);
}
else if(j==2)
{salesmanager newworker2(n,a,g,j,na);
newworker2.pay();
empl.add(newworker2);
}
else if(j==3)
{technician newworker3(n,a,g,j,na);
newworker3.pay();
empl.add(newworker3);
}
else if(j==4)
{sales newworker4(n,a,g,j,na);
newworker4.pay();
empl.add(newworker4);
}}int menu::menu1()
{
char ch[2];int a;
cout<<"    1. 职工数据录入"<<endl;
cout<<"    2. 打印全部数据"<<endl;
cout<<"    3. 查找单个职工数据"<<endl;
cout<<"    4. 删除单个职工数据"<<endl;
cout<<"    5. 删除全部数据"<<endl;
cout<<"    6. 退出"<<endl<<endl;
while (1) {
cin>>ch;
a=atoi(ch);
if(a<1||a>6)
cout<<"please write in correctly!!"<<endl;
else break;
}
return a;
}int main(void)
{ employList emplist;
menu me;
int n;
for( ; ; )
switch(me.menu1())
{
case 1:
me.addin(emplist);
break;
case 2:
emplist.display();
break;
case 3:
cout<<"请输入要查找的职工的编号:";
cin>>n;
emplist.find(n);
break;
case 4:
cout<<"请输入要删除的职工的编号:";
            cin>>n;
emplist.remove(n);
break;
case 5:
emplist.~employList();
case 6:
return 0;
}
return 1;
}

解决方案 »

  1.   

    if(j==1) 
    {manager  newworker1(n,a,g,j,na); 
    newworker1.pay(); 
    empl.add(newworker1); //这里不能用引用,因为是局部变量,退出函数的时候对象被注销,导致内存非法。改为拷贝即可。下面同理。

    else if(j==2) 
    {salesmanager newworker2(n,a,g,j,na); 
    newworker2.pay(); 
    empl.add(newworker2); 

    else if(j==3) 
    {technician newworker3(n,a,g,j,na); 
    newworker3.pay(); 
    empl.add(newworker3); 

    else if(j==4) 
    {sales newworker4(n,a,g,j,na); 
    newworker4.pay(); 
    empl.add(newworker4); 

    void add(employ e); //改成这样的
    public: 
    employ emp; 
    Node * next, *prev; 
    Node(employ e):emp(e),next(0),prev(0){} //这样的,内存就不会出错了。
    另外,display里面调用的是基类的display,要想显示子类的showdata,需要强制转换下对象。