我学习 C++ 运行时多态性的方法
我学习 C++ 运行时多态性的方法
我的简短故事与实施原因。我希望你能明白我做了什么。我创建了一个设计文档。这有望帮助其他人理解我的解决方案。这是链接到 员工工厂源代码 .
Source Code for Employee Factory Thornhil Indrustries that accept employees and starts work hours
前言
我建议先检查代码。但是,您可以在没有它的情况下继续。
我在 C++ 书中了解了运行时多态性。这个概念很陌生,但很有趣。为了消除这种感觉,我创建了一个解决方案是运行时多态性的故事。除此之外,我想吸收良好的 C++ 实践。
具有质量上下文的拉取请求
这是 我对员工工厂的拉取请求 比这篇文章有更多的上下文。
我的方法
我了解了运行时多态性。为了学习它,我不得不花一些时间来研究它。我相信这就是大家所说的经验。我清楚地记得我坚持了好几天的每一个问题。几乎就像它们刻在我的脑海里一样。所以我有了这个想法,我找到了一个解决方案。然后我使用该解决方案解决问题。
The C++ factory source code
工厂可以接受任何员工。它不关心员工的实施。
问题
工厂雇佣了很多员工。员工承担以下职责之一:清洁、检查产品质量和测试样品、维护设备、操作叉车和对齐工件。每个员工都有不同的工作职责,但他们都在工作时间工作。
解决方案
我们将实施工厂设施。一旦每个人都准备好,这样的设施将容纳所有员工并开始工作时间。
设施不需要知道员工的角色。工厂的每位员工都应该工作。他所做的是由他的角色定义的。该设施可能有许多不同名字的看门人。它们具有不同的属性值,但它们的工作相同。
Employee 类是一个接口,它声明了员工所做的事情。
Janitor、Tester、Maintenance 和 Operator 类定义了员工的行为。
实施决定
使用设计文件
Design Document Title and Description
我想尝试设计优先的方法。我相信使用代码实现现有解决方案要容易得多。代码优先的方法会产生混乱。我可以从经验中看出这一点。
使用 CMake 构建系统
The Root CMakeLists file
使用构建系统是现实工作流程的一部分。当然,我必须使用构建系统。 CMake 是一个跨平台的构建系统。它帮
使用严格的编译标志
The C++ Strict Compilation Flags
我在某处读过建议使用严格的编译标志。他们帮助我了解了新概念。
使用员工作为纯界面
Employee Interface
从语义上讲,接口声明了什么是可能的,而不是如何。数据应该在别处。因此我重构了解决方案。使用接口来声明什么是可能的。使用类 Person 来声明共享属性。
使用虚拟析构函数
编译器警告我,基类必须有一个虚拟析构函数。这是有道理的,因为当我们使用指针时,我们不会在 vtable 中拥有它。我使用默认的虚拟析构函数解决了它,因为我没有在里面使用堆分配。默认析构函数就足够了。
包括使用的标题
我了解了 IWYU——包括你使用的东西。
https://google.github.io/styleguide/cppguide.html#Include_What_You_Use
使用目标编译选项
我使用 add_compile_options 为所有目标添加它们。使用 target_compile_options 允许对每个目标使用不同的选项。例如测试。
使用 #pragma 一次
由于 Google C++ 风格指南,我使用了#ifndef。一位朋友查看了我的代码,并说在实践中使用了一次 pragma。我替换了#ifndef,因为我没有充分的理由不这样做。
删除班级人员
唯一的类人用例是属性继承。如果我从上到下查看层次结构,那是有道理的。我和一个朋友谈过,从一个新的角度来看,这没有意义。更明智的做法是定义一个接受员工的工厂。之后,当我需要一个新员工时,我可以实现一个员工接口。
更新员工执行情况
删除类 Person 并更新员工实现。每个员工实现都继承了 Person 和 Employee。 Person 允许共享属性,而 Employee 是一个接口。看待它的新方法是,实施一个履行员工承诺履行义务的角色。
使用模块化结构的反射解决方案
Code Structure
通过将解决方案划分为模块,使解决方案更具表现力。解决方案对读者来说应该更明显。代码结构应该帮助我们表达我们的解决方案。停止污染全局命名空间并模块化逻辑。使用命名空间我们不会污染全局的。
将文件拆分为接口和实现
将每个标头视为一个接口。我发现这种方法比为员工提供界面目录要干净得多。我这样做是因为 The Employee 是一个抽象类。但是,使用 impl
目录进行实现并将所有标头视为接口是一种更简洁的方法。
以 unique_ptr 作为右值引用
The Factory Class Accepts Anonymous Unique Pointer
接受员工作为右值来消费他们。我想消费匿名对象。我不能使用匿名对象,因为我不知道右值是如何工作的。
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明