【发布时间】:2016-08-01 12:31:36
【问题描述】:
我正在尝试编写一个抽象层来让我的代码在不同的平台上运行。让我举一个我最终想在高级代码中使用的两个类的例子:
class Thread
{
public:
Thread();
virtual ~Thread();
void start();
void stop();
virtual void callback() = 0;
};
class Display
{
public:
static void drawText(const char* text);
};
我的问题是:我可以使用什么设计模式让低级代码填充实现? 以下是我的想法以及为什么我认为它们不是一个好的解决方案:
理论上,将上述定义放在
highLevel/thread.h中,平台特定的实现放在lowLevel/platformA/thread.cpp中是没有问题的。这是在链接时解决的低开销解决方案。唯一的问题是低级实现不能向其添加任何成员变量或成员函数。这使得某些事情无法实现。-
一种出路是将其添加到定义中(基本上是 Pimpl-Idiom):
class Thread { // ... private: void* impl_data; }现在低级代码可以将自己的结构或对象存储在 void 指针中。这里的问题是它读起来很难看,编程也很痛苦。
-
我可以使
class Thread成为纯虚拟并通过继承它来实现低级功能。高级代码可以通过调用这样的工厂函数来访问低级实现:// thread.h, below the pure virtual class definition extern "C" void* makeNewThread(); // in lowlevel/platformA/thread.h class ThreadImpl: public Thread { ... }; // in lowLevel/platformA/thread.cpp extern "C" void* makeNewThread() { return new ThreadImpl(); }这已经足够整洁了,但是对于静态类却失败了。我的抽象层将用于硬件和 IO 方面,我真的希望能够拥有
Display::drawText(...)而不是携带指向单个Display类的指针。 另一种选择是仅使用可以在链接时解析的 C 样式函数,例如
extern "C" handle_t createThread()。这对于访问仅存在一次的低级硬件(如显示器)非常简单且非常有用。但是对于任何可能多次出现的东西(锁、线程、内存管理),我必须在我的高级代码中携带句柄,这很难看,或者有一个隐藏句柄的高级包装类。无论哪种方式,我都必须将句柄与高级和低级方面的相应功能相关联。我最后想到的是混合结构。纯 C 风格的
extern "C"函数用于只存在一次的低级内容。可以多次出现的东西的工厂函数(参见 3.)。但我担心混合的东西会导致不一致、不可读的代码。
如果您能提供符合我要求的设计模式提示,我将不胜感激。
【问题讨论】:
-
尚未阅读您的整个问题。但是 C++ 从 c++11 开始就有一个线程抽象层。
-
我正在使用 FreeRTOS 开发一个嵌入式目标,以提供线程的东西。另一个平台是基于计算机的仿真,用于更轻松地开发高级代码。我认为 C++11 不支持这种情况。
标签: c++ c abstraction hal