首页 > 解决方案 > 如何在编译时创建一个仅从两个基类之一继承的 C++ 类?

问题描述

第一次发帖。这是关于如何在 C++ 中做某事的一般问题。为了不浪费您的时间,我只是笼统地问它。但如果你的回答是“你为什么要做这么愚蠢的事情?”,我会在下面给出细节。

一般问题

我有一个带有通用代码的基类(SPIBase)。我有两个继承它的类,它们具有显着不同的实现(SPIMaster、SPISlave)。在这两个类中的每一个中,我都公开了相同的公共/受保护功能。我想编写一个可以选择 从这两个类之一继承的类。我该怎么做呢?

细节

我正在为一些微电子(ESP8266)建立一个库。我使用 Arduino IDE,库是 C++ 的。正如您可能熟悉的那样,SPI 是一种方法/协议,用于在两个微控制器或微控制器与传感器之类的东西之间进行通信。微控制器始终是主机,而其他设备/传感器始终是从机。Master 完全控制 SPI 中的通信过程。奴隶通常是相对被动的。我编写的库仅在两个 ESP8266 微控制器之间工作,以形成类似 TCP/IP 的协议,其中任何一个都可以主动向另一个发送消息。基本上,主/从问题是隐藏的,使用该库的开发人员可以以任何他们喜欢的方式和任一方向设置他们的协议。(即客户端/服务器/对等消息传递、发送/响应、流等)。

我现在想编写实现流/文件传输的层。这个类将依赖两个中间类中的一个,但除了它们继承的类之外,它们都是相同的。他们都将是发送者和接收者。我宁愿没有两个在实现上完全相同的完整类。在这种情况下,我真的不希望一个代码链的任何部分出现在另一台设备上。经过研究证明,我最初的想法是不可能的,基本上......让使用开发人员的库在他们的主程序文件中使用#define MASTER 或#define SLAVE,并且流类将基于此继承一个或其他类。我很快发现#defines 在下游是不可见的。是否有一些 C++ 设计方法/模式可以获得我想要的结果?谢谢你的时间。

标签: c++strategy-pattern

解决方案


您可以使用模板。例如:

template <typename SPIImpl>
class SPIStream : public SPIImpl
{
    // stream implementation using the common interface
};

然后,您将声明一个类的实例,如下所示:

SPIStream<SPIMaster> spi_master_stream;

或者

SPIStream<SPISlave> spi_slave_stream;

推荐阅读