包装实际实现的 C++ 适配器类

标签 c++

目标:“包装”IPC 通信总线的实际实现,以允许客户端与通用 API 接口(interface),并允许 future 可能替换底层 IPC 实现。

这是我想出的。注意:我是一名转向 C++ 的 C 人员。有没有更好的方法来解决这个问题?

注意:我希望客户端仅与我的包装器/接口(interface)交互,而不需要包含任何特定于协议(protocol)的代码或设置包括实现特定头文件的路径。

我已经浏览了设计模式。我想我想要一个适配器/包装器模式,但 Interface_impl 的顺序:公共(public)接口(interface)继承要求客户端设置包括特定实现的路径。

接口(interface)/包装器是 UMSConnector,它调用实际实现 UMSConnector_impl。

// "interface"
class UMSConnector {
public:
    static UMSConnector * instance(const string& name) {
        static UMSConnector *pInstance;
        if( ! pInstance ) {
            pInstance = new UMSConnector(name);
            return pInstance;
        }
        return pInstance;
    }

    // interface API to be implemented by UMSConnector_impl
    bool addEventHandler(string event);

private:
    class UMSConnector_impl;
    UMSConnector_impl *pImpl;
    Logger log;
    string name;

    UMSConnector(const string& name);
    ~UMSConnector();
    UMSConnector(UMSConnector const& ) {};  // copy constructor
    void operator=(const UMSConnector&) {};  // assignment constructor
};

UMSConnector::UMSConnector(const string& name)
             : name(name) {
  LOG_TRACE(log,"called");
  pImpl = new UMSConnector_impl();
}

UMSConnector::~UMSConnector() {
  LOG_TRACE(log,"called");
  delete pImpl;
  pImpl = NULL;
}

bool UMSConnector::addEventHandler(string event)
{
    if( pImpl ) {
        return pImpl->addEventHandler(event);
    }
    return false;
}

// "implementation"
class UMSConnector::UMSConnector_impl {
public:
    bool addEventHandler(const string& event);

private:
    Logger log;
};

bool UMSConnector::UMSConnector_impl::addEventHandler(const string& event)
{
  LOG_TRACE(log,"UMSConnector_impl::addEventHandler: event=%s",event.c_str());
  return true;
}

最佳答案

你需要的成语是PIMPL (pointer-to-implementation) . 只需将 UMSConnector::addEventHandler 实现设置为对 pImpl->addEventHandler() 的调用并将 UMSConnector::UMSConnector_impl 实现移动到 implementation.cpp 文件,在 interface.cpp 文件中包含 implementation.h。这应该可以如您所愿地工作。

关于包装实际实现的 C++ 适配器类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12411625/

相关文章:

c++ - 如何模板化静态工厂方法?

c++ - 为什么 memcpy 会改变字符串数组?

c++ - 如何使用Qt写入Windows C盘上的文本文件

c++ - 如何比较 2 boost::icl::interval_set 的相等性

c++ - 将 boost::optional 与 boost::adaptors::indirected 一起使用

c++ - QT多项目配置

c++ - 如何在 C++ 中手动初始化 std::list 的对象? class的指针有member list<>,不能new怎么办?

C++:读写类

c++ - 为什么这两种多维数组的实现执行时间相差这么大呢?

c++ - Boost函数指针多线程之谜