C++适配器类来包装实际实现
C++ adapter class to wrap actual implementation
目标:"包装"IPC通信总线的实际实现,以允许客户端与通用API接口,并允许未来可能替换底层IPC实现。
以下是我的想法。注意:我是一个C族,正在向C++过渡。有没有更好的方法来解决这个问题?
注意:我希望客户端只与我的包装器/接口接口,而不需要包含任何特定于协议的代码或特定于实现的头文件的设置包含路径。
我浏览了一下设计图案。我想我想要一个适配器/包装器模式,但Interface_impl:publicInterface继承的顺序要求客户端为特定的实现设置包含路径。
接口/包装器是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(指向实现的指针)。只需将UMSConnector::addEventHandler
实现设置为对pImpl->addEventHandler()
的调用,并将UMSConnector::UMSConnector_impl
实现移动到implementation.cpp
文件中,同时在interface.cpp
文件中包含implementation.h
。这应该可以随心所欲地工作。
相关文章:
- 如果没有malloc,链表实现将失败
- 如何在c++中实现处理器调度模拟器
- 如何在c++中使用引用实现类似python的行为
- 为左值和右值的包装器实现C++范围
- 为 Sql 服务器实现 odbc 包装器.将数据库数据读取为字符或要求驱动程序将数据转换为 C 类型
- 如何减少大量包装类的实现代码?
- 在实现文件中,我们应该更喜欢"using namespace"指令还是将实现包装在命名空间 { } 中?
- 使用可变参数模板函数在类周围实现基于 pImpl 的包装器
- 在C++中实现和包装函数组合以进行惰性计算
- 尝试实现 Windows API 包装器的事件处理程序时遇到问题
- C++适配器类来包装实际实现
- 用相同的数据c++包装/铸造类和结构,以实现外部api
- 线程包装器实现问题
- 包装 API 时,我是否应该避免在实现类中进行向上转换
- libPd 和 c++ 包装器实现
- 如何在C++中实现NodeJS JavaScript API的包装器
- 如何在c#中实现c++包装器?
- 是否有一种方法可以实现fscanf的包装函数?
- 基类中抽象方法的包装器实现
- 运算符重载 - 在 char 数组包装类中实现 C++ setter 的正确方法是什么