我学习 C++ 运行时多态性的方法

我学习 C++ 运行时多态性的方法

我的简短故事与实施原因。我希望你能明白我做了什么。我创建了一个设计文档。这有望帮助其他人理解我的解决方案。这是链接到 员工工厂源代码 .

Source Code for Employee Factory Thornhil Indrustries that accept employees and starts work hours

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 版权协议,转载请附上原文出处链接和本声明

本文链接:https://www.qanswer.top/39260/52052511

posted @ 2022-09-25 11:52  哈哈哈来了啊啊啊  阅读(36)  评论(0编辑  收藏  举报