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++右移运算符的一个小坑及解决

《C++右移运算符的一个小坑及解决》文章指出右移运算符处理负数时左侧补1导致死循环,与除法行为不同,强调需注意补码机制以正确统计二进制1的个数... 目录我遇到了这么一个www.chinasem.cn函数由此可以看到也很好理解总结我遇到了这么一个函数template<typename T>unsigned

Spring Security简介、使用与最佳实践

《SpringSecurity简介、使用与最佳实践》SpringSecurity是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架,本文给大家介绍SpringSec... 目录一、如何理解 Spring Security?—— 核心思想二、如何在 Java 项目中使用?——

防止Linux rm命令误操作的多场景防护方案与实践

《防止Linuxrm命令误操作的多场景防护方案与实践》在Linux系统中,rm命令是删除文件和目录的高效工具,但一旦误操作,如执行rm-rf/或rm-rf/*,极易导致系统数据灾难,本文针对不同场景... 目录引言理解 rm 命令及误操作风险rm 命令基础常见误操作案例防护方案使用 rm编程 别名及安全删除

C++统计函数执行时间的最佳实践

《C++统计函数执行时间的最佳实践》在软件开发过程中,性能分析是优化程序的重要环节,了解函数的执行时间分布对于识别性能瓶颈至关重要,本文将分享一个C++函数执行时间统计工具,希望对大家有所帮助... 目录前言工具特性核心设计1. 数据结构设计2. 单例模式管理器3. RAII自动计时使用方法基本用法高级用法

PHP应用中处理限流和API节流的最佳实践

《PHP应用中处理限流和API节流的最佳实践》限流和API节流对于确保Web应用程序的可靠性、安全性和可扩展性至关重要,本文将详细介绍PHP应用中处理限流和API节流的最佳实践,下面就来和小编一起学习... 目录限流的重要性在 php 中实施限流的最佳实践使用集中式存储进行状态管理(如 Redis)采用滑动

ShardingProxy读写分离之原理、配置与实践过程

《ShardingProxy读写分离之原理、配置与实践过程》ShardingProxy是ApacheShardingSphere的数据库中间件,通过三层架构实现读写分离,解决高并发场景下数据库性能瓶... 目录一、ShardingProxy技术定位与读写分离核心价值1.1 技术定位1.2 读写分离核心价值二

深入浅出Spring中的@Autowired自动注入的工作原理及实践应用

《深入浅出Spring中的@Autowired自动注入的工作原理及实践应用》在Spring框架的学习旅程中,@Autowired无疑是一个高频出现却又让初学者头疼的注解,它看似简单,却蕴含着Sprin... 目录深入浅出Spring中的@Autowired:自动注入的奥秘什么是依赖注入?@Autowired

MySQL分库分表的实践示例

《MySQL分库分表的实践示例》MySQL分库分表适用于数据量大或并发压力高的场景,核心技术包括水平/垂直分片和分库,需应对分布式事务、跨库查询等挑战,通过中间件和解决方案实现,最佳实践为合理策略、备... 目录一、分库分表的触发条件1.1 数据量阈值1.2 并发压力二、分库分表的核心技术模块2.1 水平分

深入解析C++ 中std::map内存管理

《深入解析C++中std::map内存管理》文章详解C++std::map内存管理,指出clear()仅删除元素可能不释放底层内存,建议用swap()与空map交换以彻底释放,针对指针类型需手动de... 目录1️、基本清空std::map2️、使用 swap 彻底释放内存3️、map 中存储指针类型的对象

SpringBoot通过main方法启动web项目实践

《SpringBoot通过main方法启动web项目实践》SpringBoot通过SpringApplication.run()启动Web项目,自动推断应用类型,加载初始化器与监听器,配置Spring... 目录1. 启动入口:SpringApplication.run()2. SpringApplicat