0
点赞
收藏
分享

微信扫一扫

第十周项目3 警察和厨师继承组合类


/*     
*Copyright(c) 2016,烟台大学计算机学院
*作 者:刘金石
*完成日期:2016年5月3日
*问题描述:警察和厨师
*/

<pre name="code" class="cpp">(1)根据下面的类图,定义各个类:

第十周项目3 警察和厨师继承组合类_构造和析构函数


<pre name="code" class="cpp">要求: 
各个成员函数,只要输出相关的信息即可,暂不深究其业务功能
请为各个类增加构造函数
在实现中,可以增加需要的其他函数
自行编制main函数,完成初步的测试

解答:

#include<iostream>
using namespace std;
class Person
{
int age;
string name;
public:
Person(int a,string nam);
void action();
string getName()
{
return name;
}
int getAge()
{
return age;
}
};
Person::Person(int a,string nam):age(a),name(nam){};
void Person::action()
{
cout<<"I am a man"<<endl;
}
class Polic:public Person
{
int level;
public:
Polic(int a,string nam,int le):Person(a,nam),level(le){}
void arrest(Person);
};
void Polic::arrest(Person Per)
{
cout<<Per.getName()<<" be arrested!"<<endl;
}
class Cook:public Person
{
double salary;
public:
Cook(int a,string nam,double sa):Person(a,nam),salary(sa){}
void getCake(int );
};
void Cook::getCake(int n)
{
cout<<"Get"<<" "<<n<<" "<<"cakes!"<<endl;
}
int main()
{
Person Mary(19,"mary");
Polic Jack(21,"jack",3);
Cook Make(20,"make",5000);
Jack.arrest(Mary);
Make.getCake(5);
return 0;
}

运行结果:


<pre name="code" class="cpp">(2)下面的类图,为Polic类和Cook类增加了对象成员,请扩充代码,完成上述各项要求

第十周项目3 警察和厨师继承组合类_C++_02


参考解答:

<pre name="code" class="cpp">#include<iostream>
using namespace std;
class Person
{
int age;
string name;
public:
Person(int a,string nam);
void action();
string getName()
{
return name;
}
int getAge()
{
return age;
}
};
Person::Person(int a,string nam):age(a),name(nam){};
void Person::action()
{
cout<<"I am a man"<<endl;
}
class Polic:public Person
{
int level;
Person leader;
public:
Polic(int a,string nam,int ag,string na,int le):Person(a,nam),leader(ag,na),level(le){}
void arrest(Person);
};
void Polic::arrest(Person Per)
{
cout<<Per.getName()<<" be arrested!"<<endl;
}
class Cook:public Person
{
double salary;
Polic protector;
public:
Cook(int age1,string name1,int a,string nam,int ag,string na,int le,double sa):Person(age1,name1),protector(a,nam,ag,na,le),salary(sa){}
void getCake(int );
};
void Cook::getCake(int n)
{
cout<<"Get"<<" "<<n<<" "<<"cakes!"<<endl;
}
int main()
{
Person Mary(19,"mary");
Polic Jack(21,"jack",22,"Tom",3);
Cook Make(20,"mike",19,"red",23,"jnney",5,5000);
Jack.arrest(Mary);
Make.getCake(5);
return 0;
}

运行结果同上


存在的问题:

<pre name="code" class="cpp"> 这些代码是完成是题目的要求,但是,并不好。 
- 每个构造函数带上一长串的参数,难写,难看,这本身就是质量问题。
- 这种写法,也根本未体现对象的“封装”——都是一串散乱的基本类型数据在工作。
- 我们希望看到jack警察的上司就是一个人,mike厨师的保卫者,就是一个警察。
- 需要做的是,利用对象作为构造函数的参数,使结构清晰。
- 当然,这时需要增加相关的复制构造函数了。

修改后的程序:

<pre name="code" class="cpp">#include <iostream>
using namespace std;
class Person
{
public:
Person(int, string);
Person(const Person &P );//Person类的复制构造函数
void action();
string getName()
{
return name;
}
private:
int age;
string name;
};
Person::Person(const Person &P ) //Person类的复制构造函数
{
age=P.age;
name=P.name;
}
Person::Person(int a, string n):age(a), name(n) {}
void Person::action()
{
cout<<name<<" do some action"<<endl;
}
class Police: public Person
{
public:
Police(const Police &Po );//Police的复制构造函数
Police(int a, string n, int l, Person);
void arrest(Person);
void show();
private:
int level; //级别
Person leader; //领导
};
Police::Police(const Police &Po ):Person(Po),leader(Po.leader),level(Po.level)//Police的复制构造函数
{

}
Police::Police(int a, string n, int l, Person p):Person(a,n),level(l),leader(p) {}
void Police::arrest(Person p)
{
cout<<"Police "<<getName()<<" arrest " <<p.getName()<<endl;
}
void Police::show()
{
cout<<"Police "<<getName()<<", leader is " <<leader.getName()<<endl;
}

class Cook: public Person
{
public:
Cook(int a, string n, double s,Police p);
void getCake(int);
void show();
private:
double salary; //薪水
Police protector; //厨师小店的片区警察
};
Cook::Cook(int a, string n, double s,Police p):
Person(a,n),salary(s),protector(p) {}
void Cook::getCake(int n)
{
cout<<"Cook "<<getName()<<" gave me " <<n<<" cakes."<<endl;
}
void Cook::show()
{
cout<<"Cook "<<getName()<<" is protected by Police "<<protector.getName()<<endl;
}

int main()
{
Person jerry(43,"Jerry");
Police jack(30,"Jack",2,jerry);
Cook john(24,"John",5000,jack);
jack.show();
john.show();
return 0;
}

运行结果:











举报

相关推荐

0 条评论