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;
    }

有線と無線の 2 つのプラットフォームがある場合、このクラスを拡張してファイルを整理し、HAL()変更されないようにする方法を教えてください。

また、動的バインディング、つまりキーワード「virtual」を使用したくありません。私の場合、プラットフォームはコンパイル時に認識されます。

// 私はこれをしたくありません:) ...

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して、それから継承する 2 つのクラスWiredDataと「WirelessData」を作成すると、次のようなことが可能になります。

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

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

sendData()data1 および data2 オブジェクトを呼び出すと、ポリモーフィズムが発生します。コンパイラはsendData()、型であると宣言されていても、特定のサブタイプごとにメソッドを呼び出します。Data

于 2012-10-03T01:59:22.380 に答える
1

C の世界から来て、これはプラットフォーム固有の関数ポインターを埋めるのと同じくらい簡単な作業です。

C++ でもほとんど同じです。Data クラスの sendData() 関数virtual(virtual署名の前にキーワードを付けます) を作成し、適切な機能を指定する Wired および Wireless 実装クラスを派生させることができsendData()ます。次に、どちらを使用するかを決定する何らかの if ステートメントがあり、必要に応じてまたはオブジェクトData*に変数を保持します...を呼び出すと、対応する実装が呼び出されます。これはすべて本当に基本的なことです。オンラインで C++ の入門チュートリアルをいくつか行うか、本を入手してください。推奨されるトレーニング資料をリストした他のスタックオーバーフローの質問があります。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 に答える