gpt4 book ai didi

c++ - 设计模式 : C++ Abstraction Layer

转载 作者:太空狗 更新时间:2023-10-29 22:58:56 24 4
gpt4 key购买 nike

我正在尝试编写一个抽象层来让我的代码在不同的平台上运行。让我举一个我最终想在高级代码中使用的两个类的例子:

class Thread
{
public:
Thread();
virtual ~Thread();

void start();
void stop();

virtual void callback() = 0;
};

class Display
{
public:
static void drawText(const char* text);
};

我的麻烦是:我可以使用什么设计模式让低级代码填充实现?以下是我的想法以及为什么我认为它们不是一个好的解决方案:

  1. 理论上,将上述定义放在 highLevel/thread.h 中并将特定于平台的实现放在 lowLevel/platformA/thread.cpp 中是没有问题的>。这是一种在链接时解析的低开销解决方案。唯一的问题是低级实现不能向它添加任何成员变量或成员函数。这使得某些事情无法实现。

  2. 解决方法是将其添加到定义中(基本上是 Pimpl-Idiom):

    class Thread 
    {
    // ...
    private:
    void* impl_data;
    }

    现在低级代码可以将自己的结构或对象存储在 void 指针中。这里的问题是它读起来很丑,编程也很痛苦。

  3. 我可以使 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< 的指针 类。

  4. 另一种选择是仅使用可在链接时解析的 C 样式函数,例如 extern "C"handle_t createThread()。这对于访问只存在一次的低级硬件(如显示器)来说非常简单。但是对于任何可以多次出现的东西(锁、线程、内存管理),我必须在我的高级代码中携带句柄,这很丑陋或者有一个隐藏句柄的高级包装类。无论哪种方式,我都有必须将句柄与高级和低级端的相应功能相关联的开销。

  5. 我最后想到的是混合结构。纯 C 风格的 extern "C" 函数用于只存在一次的低级内容。工厂函数(参见 3.),用于可以多次出现的东西。但我担心混合的东西会导致不一致、不可读的代码。

如果能提供符合我要求的设计模式提示,我将不胜感激。

最佳答案

您不需要拥有与平台无关的基类,因为您的代码一次只针对一个具体平台编译。

只需将包含路径设置为,例如,-Iinclude/generic -Iinclude/platform,并在每个支持的平台的包含目录中有一个单独的 Thread 类.

您可以(并且应该)编写与平台无关的测试,默认情况下编译和执行,以确认您的不同平台特定实现遵循相同的接口(interface)和语义。

附言。正如 StoryTeller 所说,Thread 是一个糟糕的例子,因为已经有一个可移植的 std::thread。我假设您确实需要提取其他一些特定于平台的细节。

PPS。您仍然需要弄清楚通用(与平台无关)代码和特定于平台的代码之间的正确划分:没有 Elixir 可以决定什么去哪里,只是重用/复制之间的一系列权衡,简单代码与高度参数化代码等。

关于c++ - 设计模式 : C++ Abstraction Layer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38698991/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com