C++实践参考:警察与厨师

2024-03-03 06:48
文章标签 c++ 实践 参考 警察 厨师

本文主要是介绍C++实践参考:警察与厨师,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

【项目-警察和厨师】
(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类中该定义复制构造函数,在这里没有写,用其默认复制构造函数了。相关类中没有定义指针型成员,不必要深复制,所以,可以使用默认复制构造函数。

这篇关于C++实践参考:警察与厨师的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/768812

相关文章

C++如何通过Qt反射机制实现数据类序列化

《C++如何通过Qt反射机制实现数据类序列化》在C++工程中经常需要使用数据类,并对数据类进行存储、打印、调试等操作,所以本文就来聊聊C++如何通过Qt反射机制实现数据类序列化吧... 目录设计预期设计思路代码实现使用方法在 C++ 工程中经常需要使用数据类,并对数据类进行存储、打印、调试等操作。由于数据类

Linux下如何使用C++获取硬件信息

《Linux下如何使用C++获取硬件信息》这篇文章主要为大家详细介绍了如何使用C++实现获取CPU,主板,磁盘,BIOS信息等硬件信息,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下... 目录方法获取CPU信息:读取"/proc/cpuinfo"文件获取磁盘信息:读取"/proc/diskstats"文

Java Optional的使用技巧与最佳实践

《JavaOptional的使用技巧与最佳实践》在Java中,Optional是用于优雅处理null的容器类,其核心目标是显式提醒开发者处理空值场景,避免NullPointerExce... 目录一、Optional 的核心用途二、使用技巧与最佳实践三、常见误区与反模式四、替代方案与扩展五、总结在 Java

C++使用printf语句实现进制转换的示例代码

《C++使用printf语句实现进制转换的示例代码》在C语言中,printf函数可以直接实现部分进制转换功能,通过格式说明符(formatspecifier)快速输出不同进制的数值,下面给大家分享C+... 目录一、printf 原生支持的进制转换1. 十进制、八进制、十六进制转换2. 显示进制前缀3. 指

Spring Boot循环依赖原理、解决方案与最佳实践(全解析)

《SpringBoot循环依赖原理、解决方案与最佳实践(全解析)》循环依赖指两个或多个Bean相互直接或间接引用,形成闭环依赖关系,:本文主要介绍SpringBoot循环依赖原理、解决方案与最... 目录一、循环依赖的本质与危害1.1 什么是循环依赖?1.2 核心危害二、Spring的三级缓存机制2.1 三

C++中初始化二维数组的几种常见方法

《C++中初始化二维数组的几种常见方法》本文详细介绍了在C++中初始化二维数组的不同方式,包括静态初始化、循环、全部为零、部分初始化、std::array和std::vector,以及std::vec... 目录1. 静态初始化2. 使用循环初始化3. 全部初始化为零4. 部分初始化5. 使用 std::a

Python 中的 with open文件操作的最佳实践

《Python中的withopen文件操作的最佳实践》在Python中,withopen()提供了一个简洁而安全的方式来处理文件操作,它不仅能确保文件在操作完成后自动关闭,还能处理文件操作中的异... 目录什么是 with open()?为什么使用 with open()?使用 with open() 进行

C++ vector的常见用法超详细讲解

《C++vector的常见用法超详细讲解》:本文主要介绍C++vector的常见用法,包括C++中vector容器的定义、初始化方法、访问元素、常用函数及其时间复杂度,通过代码介绍的非常详细,... 目录1、vector的定义2、vector常用初始化方法1、使编程用花括号直接赋值2、使用圆括号赋值3、ve

如何高效移除C++关联容器中的元素

《如何高效移除C++关联容器中的元素》关联容器和顺序容器有着很大不同,关联容器中的元素是按照关键字来保存和访问的,而顺序容器中的元素是按它们在容器中的位置来顺序保存和访问的,本文介绍了如何高效移除C+... 目录一、简介二、移除给定位置的元素三、移除与特定键值等价的元素四、移除满足特android定条件的元

Python获取C++中返回的char*字段的两种思路

《Python获取C++中返回的char*字段的两种思路》有时候需要获取C++函数中返回来的不定长的char*字符串,本文小编为大家找到了两种解决问题的思路,感兴趣的小伙伴可以跟随小编一起学习一下... 有时候需要获取C++函数中返回来的不定长的char*字符串,目前我找到两种解决问题的思路,具体实现如下: