1

我只有 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()不会改变。

我也不想要动态绑定,即使用关键字“虚拟”。在我的情况下,平台在编译时是已知的。

// 我不想这样做 :) ...

int HAL() {
Data* data = new WiredData();
data.sendData();

data = new WirelessData();

data.sendData();

}

在我的情况下,平台在编译时是已知的。

来自 C 世界,这就像填写平台特定的函数指针一样简单。

以 Boost C++ API 中的“线程”类为例。该类通过调用基于平台的 Windows 线程 API 或 Linux 线程 API 自动生成线程。这样我的 HAL 就真正独立于平台了。

  • 谢谢克里斯
4

4 回答 4

1

这更像是一个设计问题,而不是一个实际的 C++ 问题,但您要查找的术语是polymorphism. 您可以使用您的Data类并创建两个继承自它的类WiredData和`WirelessData,这将使您能够执行以下操作:

Data data1 = new WiredData();
Data data2 = new WirelessData();

data1.sendData();
data2.sendData();

当您调用 data1 和 data2 对象时,多态性开始发挥作用sendData(),编译器将调用sendData()每个特定子类型的方法,即使它们被声明为类型Data

于 2012-10-03T01:59:22.380 回答
1

来自 C 世界,这就像填写平台特定的函数指针一样简单。

在 C++ 中几乎相同。您可以创建 Data 类的 sendData() 函数virtual(将关键字作为签名的前缀virtual),然后派生指定适当sendData()功能的有线和无线实现类。然后,您有某种 if 语句,您可以在其中决定使用哪一个,并根据需要为or对象保留一个Data*变量……当您调用 时,它将调用相应的实现。这都是非常基础的——你应该在网上做几个介绍性的 C++ 教程,或者拿一本书。还有其他列出推荐的培训材料的 stackoverflow 问题。WiredWirelesspointer->sendData()

编辑:根据您在下面的评论中的要求提供大纲。

class Wrapper
{
    Data* p_;
  public:
    void sendData()
    {
        if (not p_)
            p_ = ... ? new Wired() : new Wireless();
        p_->sendData();
    }
}
于 2012-10-03T02:03:15.603 回答
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 .
于 2012-10-04T03:52:32.323 回答
0

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

Data_Windows.cppData_Unix.cpp(例如)然后使用您的构建系统仅在该平台上的构建中包含相关文件?还是我在这里遗漏了什么……?

于 2012-10-03T08:34:40.240 回答