我只掌握了C ++的基础知识。我试图在C ++中实现硬件抽象层(HAL)。假设我想实现这个名为Data的类。基于该平台,数据可以有线或无线发送。
class Data() {
public Data() {
//create random data
}
public sendData() {
// send data
}
public platform_action1() {
// do some platform specific action
}
}
// My HAL
int HAL() {
Data myData;
myData.platform_action1();
myData.sendData();
return 0;
}
现在,如果我有两个有线和无线平台,我如何扩展此类并组织我的文件,以便HAL()
保持不变。
此外,我不想动态绑定,即使用关键字'virtual'。 在我的情况下,该平台在编译时是已知的。
//我不想这样做:) ...
int HAL() {
Data* data = new WiredData();
data.sendData();
data = new WirelessData();
data.sendData();
}
在我的情况下,平台在编译时是已知的。
来自C世界,这就像填写平台特定的函数指针一样简单。
以Boost C ++ API中的'thread'类为例。该类通过调用基于该平台的Windows线程API或Linux线程API自动生成线程。这样我的HAL就是真正独立于平台的。
答案 0 :(得分:1)
这更像是一个设计问题,而不是一个实际的C ++问题,但你要找的术语是polymorphism
。您可以使用Data
类创建两个继承自它的类WiredData
和`WirelessData,这将使您能够执行以下操作:
Data data1 = new WiredData();
Data data2 = new WirelessData();
data1.sendData();
data2.sendData();
当您在data1和data2对象上调用sendData()
时,多态性发挥作用,编译器将为每个特定子类型调用sendData()
方法,即使它们被声明为{{1}类型}
答案 1 :(得分:1)
来自C世界,这就像填写平台特定的函数指针一样简单。
在C ++中它几乎相同。您可以使Data类的sendData()函数virtual
(将virtual
关键字作为签名前缀),然后派生指定适当sendData()
功能的有线和无线实现类。然后,您可以使用某种if语句来决定使用哪一个,并根据需要将Data*
变量保留到Wired
或Wireless
对象...当您调用{{1它将调用相应的实现。这一切都非常基础 - 你应该在网上做一些介绍性的C ++教程,或者拿一本书。还有其他stackoverflow问题列出了推荐的培训材料。
编辑:根据以下评论中的请求提供的大纲。
pointer->sendData()
答案 2 :(得分:0)
为什么不将更改成员的定义放入名为: -
的文件中 Data_Windows.cpp
和Data_Unix.cpp
(例如)然后使用您的构建系统仅在该平台上的构建中包含相关文件?或者我在这里遗漏了什么......?
答案 3 :(得分:0)
Can we do this using PIMPL(Private Implementation) approach? This is what I am thinking ...
// In Data.h
class PlatformDataProcess; // forward declaration of Pimpl
class Data
{
public:
Data (const IPC& ipc); // process IPC
~Data();
Data( const Data &rhs ); // undefined for simplicity
Data& operator=( Data );
void process_ipc();
private:
PlatformDataProcess *pimpl_; // the Pimpl
};
// In Wired.cpp
#include "Data.h"
class PlatformDataProcess
{
public:
void SendData() {// send data on wired}
};
// In Data.cpp
Data::Data() : pimpl_( new PlatformDataProcess() )
{
}
Data::~Data()
{
delete pimpl_;
}
void Data::SendData()
{
pimpl_->SendData(); // do some private work
}
int HAL() {
// receive IPC
Data* data = new Data(ipc);
data->SendData();
}
So all the user needs to do is supply the platform specific file like wired.cpp .