C++实践参考:警察与厨师
来源:互联网 发布:天盾android数据恢复 编辑:程序博客网 时间:2024/05/17 02:34
【项目-警察和厨师】
(1)根据下面的类图,定义各个类:
要求:
各个成员函数,只要输出相关的信息即可,暂不深究其业务功能
请为各个类增加构造函数
在实现中,可以增加需要的其他函数
自行编制main函数,完成初步的测试
[参考解答1]
#include <iostream>using namespace std;class Person{public: Person(int, string); void action(); string getName() { return name; }private: int age; string 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(int, string, int); void arrest(Person);private: int level; //级别};Police::Police(int a, string n, int l):Person(a,n),level(l) {}void Police::arrest(Person p){ cout<<" Police "<<getName()<<" arrest " <<p.getName()<<endl;}class Cook: public Person{public: Cook(int, string, double); void getCake(int);private: double salary; //薪水};Cook::Cook(int a, string n, double s):Person(a,n),salary(s) {}void Cook::getCake(int n){ cout<<" Cook "<<getName()<<" gave me " <<n<<" cakes."<<endl;}int main(){ Person tom(120,"Tom"); Police jack(30,"Jack",2); Cook john(24,"John",5000); jack.arrest(tom); john.getCake(4); return 0;}
(2)下面的类图,为Polic类和Cook类增加了对象成员,请扩充代码,完成上述各项要求
[参考解答1]
#include <iostream>using namespace std;class Person{public: Person(int, string); void action(); string getName() { return name; }private: int age; string 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(int a, string n, int l, int la, string ln); void arrest(Person); void show();private: int level; //级别 Person leader; //领导};Police::Police(int a, string n, int l, int la, string ln):Person(a,n),level(l),leader(la,ln) {}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,int pa, string pn, int pl, int pla, string pln); void getCake(int); void show();private: double salary; //薪水 Police protector; //厨师小店的片区警察};Cook::Cook(int a, string n, double s,int pa, string pn, int pl, int pla, string pln): Person(a,n),salary(s),protector(pa,pn,pl,pla,pln) {}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 tom(120,"Tom"); Police jack(30,"Jack",2,43,"Jerry"); Cook john(24,"John",5000,30,"Jack",2,43,"Jerry"); jack.show(); john.show(); return 0;}
评价:
- 这些代码是完成是题目的要求,但是,并不好。
- 每个构造函数带上一长串的参数,难写,难看,这本身就是质量问题。
- 这种写法,也根本未体现对象的“封装”——都是一串散乱的基本类型数据在工作。
- 我们希望看到jack警察的上司就是一个人,john厨师的保卫者,就是一个警察。
- 需要做的是,利用对象作为构造函数的参数,使结构清晰。
- 当然,这时需要增加相关的复制构造函数了。
[参考解答2]
#include <iostream>using namespace std;class Person{public: Person(int, string); void action(); string getName() { return name; }private: int age; string 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(int a, string n, int l, Person); void arrest(Person); void show();private: int level; //级别 Person leader; //领导};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;}
评论:
这样做,是不是在逻辑上很清楚了?
Person、Police类中该定义复制构造函数,在这里没有写,用其默认复制构造函数了。相关类中没有定义指针型成员,不必要深复制,所以,可以使用默认复制构造函数。
2 0
- C++实践参考:警察与厨师
- 警察与厨师
- 警察与厨师
- 警察与厨师2
- 警察与厨师
- 警察与厨师
- 警察与厨师2
- 警察与厨师
- 项目32-警察与厨师
- 警察与厨师(1)
- 警察与厨师(2)
- 第十一周实践项目3————警察与厨师(1)
- 第十一周实践项目3————警察与厨师(2)
- 第十周项目42-警察与厨师
- 第10、11周-警察与厨师
- 第十周——警察与厨师
- 第十,十一周,警察与厨师2
- 第十一周项目三警察与厨师
- 设置Linux内核参数 /etc/sysctl.conf
- [文档] TDDL和Diamond的使用(三):TDDL
- 剑指offer:把数组排成最小的数
- Sa求法
- MySQL子查询与连接
- C++实践参考:警察与厨师
- Java并发编程:如何创建线程?
- 字符串的封装
- Python 正则表达式的简单使用示例
- ionic版本从v1.0.0升级到v1.2.4后,android上使用<ion-content>的页面无法滑动
- ajax动态添加tr td (并用PHP返回值设置tr样式,用于删除操作
- TDDL动态数据源开源-示例使用说明
- Python之numpy
- Cocosd2d-js 数组使用