硬件抽象层 (HAL) 中实现的动态切换
Dynamic switching of implementation in hardware abstraction layer (HAL)
我正在尝试实现一个硬件抽象层(HAL(,以使用相同的接口访问多个类似的设备。 问题是,我应该如何实现一个设备类与另一个设备类的实现的动态切换.
下面的代码显示了我实际上是如何做到这一点的。 但是,我不确定此实现是否足够安全。特别是我不确定使用"shared_ptr"切换实现是否正确,或者使用工厂模式甚至更多抽象是否更好。 您建议如何实现这样的动态 HAL?
#include <iostream>
#include <string>
#include <memory>
using namespace std;
// Common HAL base class
struct Base {
virtual string Identify() {return string("Baseclass");}
Base() {cout << "Base Constructor" << 'n';}
virtual ~Base() {cout << "Base Destructor" << 'n';}
// Important to make destructor virtual so that destructor of derived classes is invoked, too
};
// HAL Device 1 Implementation
struct Derived1: public Base {
string Identify() override {return string("Derived 1 class");}
Derived1() {cout << "Derived1 Constructor" << 'n';}
~Derived1() {cout << "Derived1 Destructor" << 'n';}
};
// HAL Device 2 Implementation
struct Derived2: public Base {
string Identify() override {return string("Derived 2 class");}
Derived2() {cout << "Derived2 Constructor" << 'n';}
~Derived2() {cout << "Derived2 Destructor" << 'n';}
};
// Switches implementation via setting a pointer to a class instance
struct ImplementationDispatcher {
shared_ptr<Base> Impl = make_shared<Base>();
Base& Implementation() {return *Impl;}
void SetImplementation(shared_ptr<Base> impl) {Impl = impl;}
};
// Top level class which calls HAL device functions
struct Actor {
ImplementationDispatcher HAL;
void Work() {cout << HAL.Implementation().Identify() << 'n';}
void SetActor(shared_ptr<Base> newImpl) {HAL.SetImplementation(newImpl);}
};
int main()
{
Actor actor;
actor.Work();
actor.SetActor(make_shared<Derived1>());
actor.Work();
actor.SetActor(make_shared<Derived2>());
actor.Work();
}
我为所有设备定义了一个具有通用功能的基类(在本例中,这只是Identify()
方法(。 然后我为设备实现Derived1
和Derived2
派生类。 我想在主代码中的这些实现之间切换(例如设备选择器或类似的。在示例中,这只是通过从 main 调用一个 setter 来完成的(.
为了实现切换,我添加了一个类ImplementationDispatcher
,它包含对当前实现的shared_ptr
以进行隔离,类似于 pimpl-habitm。 切换是通过向切换器类提供基类的新子类实例来完成的。
似乎是过度设计。只需实现您的抽象设备并将适当的实例传递给Work
。至少在您的示例中,根本不需要ImplementationDispatcher
.
相关文章:
- 通过构造函数动态确定类实现
- 实现动态插件管理器
- 硬件抽象层 (HAL) 中实现的动态切换
- C++ 如何使用动态计算的新节点实现 A*?
- 使用 LLVM IR 实现动态类型语言
- 如何正确实现动态矩阵的复制构造函数
- 使用链哈希实现动态哈希表
- C++编译器在 main 之后实现动态初始化
- 如何在C++中实现动态数组
- 实现动态数组数据结构时出现"double free or corruption"错误
- 如何实现动态线程 Boost::Barrier
- C++Visual Studio 2010,在实现动态堆栈时编译错误C3867
- 如何实现动态模块(在头文件中)加载c++
- 有没有一种方法可以在c++中实现动态工厂模式
- 我将如何在c++中实现动态绑定的这种使用
- 如何在c++中实现动态元素容器
- 分布式仿真中如何实现动态TCP端口调度
- 如何在c++ 11和c++ 14中实现动态函数调用
- 在多读程序中实现动态屏障的可能方法
- 实现动态矩阵类的错误