举例说明用C ++编写抽象层

时间:2012-10-03 01:50:43

标签: c++

我只掌握了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就是真正独立于平台的。

  • 感谢 克里斯

4 个答案:

答案 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*变量保留到WiredWireless对象...当您调用{{1它将调用相应的实现。这一切都非常基础 - 你应该在网上做一些介绍性的C ++教程,或者拿一本书。还有其他stackoverflow问题列出了推荐的培训材料。

编辑:根据以下评论中的请求提供的大纲。

pointer->sendData()

答案 2 :(得分:0)

为什么不将更改成员的定义放入名为: -

的文件中

Data_Windows.cppData_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 .