【发布时间】:2019-08-05 21:38:55
【问题描述】:
我想就在 C++ 中拆分硬件相关代码的最佳方式询问您的意见。 目前我有一个类正在实现一个使用#ifdef 的温度传感器接口:
class TemperatureSensor : public TemperatureI
{
TemperatureSensor()
{
#ifdef PLATFORM_A
/* Platform A dependant code */
#elsif PLATFORM_B
/* Platform B dependant code */
#endif
}
~TemperatureSensor()
{
#ifdef PLATFORM_A
/* Platform A dependant code */
#elsif PLATFORM_B
/* Platform B dependant code */
#endif
}
int getTemp()
{
#ifdef PLATFORM_A
/* Platform A dependant code */
#elsif PLATFORM_B
/* Platform B dependant code */
#endif
}
};
当然有几种方法和不止 1 行硬件相关代码。
现在我想要的是:
- 从代码中一起删除 ifdefs,或者如果不可能,将其限制在一个地方
- 决定创建正确的实现以编译时间(使用 CMakeLists.txt)
- 尽可能少的样板代码(可能有一个帮助类,因为我打算在多个地方使用此解决方案,但每个地方都应有最低开销)
一种解决方案是使用 PIMPL 和工厂,但不幸的是,这会导致文件过多和大量间接。
- TemperatureSensor.cpp
- TemperatureSensor.hpp
- TemperatureSensorPlatformFactory.hpp
- TemperatureSensorPlatformA.cpp
- TemperatureSensorPlatformA.hpp
- TemperatureSensorPlatformAFactory.cpp
- TemperatureSensorPlatformB.cpp
- TemperatureSensorPlatformB.hpp
- TemperatureSensorPlatformBFactory.cpp
还有如下代码:
class TemperatureSensor : public TemperatureI
{
TemperatureSensor() :
pImpl(TemperatureSensorFactory.create())
{}
int getTemp()
{
return pImpl.getTemp();
}
};
你有更好的想法吗?
【问题讨论】:
-
您可以有条件地编译 整个
TemperatureSensor类(可能使用不同的名称以避免混淆,并允许在一个程序中使用两个传感器,并使用 typedef 将TemperatureSensor映射到正确的类)。不同传感器类型之间共享多少代码共性? -
当然,最好的方法取决于你的整体设计和意图的性质,这不是很清楚。术语“硬件相关”代码是否与支持不同温度传感器或使用相同温度传感器的不同平台有关?