2016-04-19 21 views
0

PHPとJavaのバックグラウンドから来ています。私が望むほど簡単ではないC++でのやりたいことです。C++で拡張した後の実装へのヘッダのバインド

のは、私は(私はインターフェイスとして参照)は、ヘッダーファイル含むクラスがあるとしましょうSensor

Iは、センサの複数のタイプを持っていますが、それらの全ては、以下のような

  • を初期化する基本的な機能を持っています
  • が、しかし目を

を読み書きeyはそれぞれセンサーごとに異なる方法で実装されています。

PHPでは、IoCと依存関係注入を使用して、特定の実装をインターフェイスにバインドすることができます。

各センサーの特定の実装で「インターフェース」/ヘッダーを拡張するにはどうすればよいですか?

私はそうのようなファイル構造を持つ想像:.cppファイルはすべてSensorインターフェイスのための異なった実装である sensor.h sensor1.cpp sensor2.cpp

私のコンパイラはC++ 11と互換性があり、私は「新しい」方法でやりたいと思っています。

+0

申し訳ありませんが、私はあまりにも広範であるとしてクローズする投票する必要があります - あまりにも多くの可能性がここにあります、そして特定の状況のた​​めに右のいずれかを選択するには、あなたが説明していない要因の多くに依存します(あなたがそれらについて議論し、それぞれに答えを与えたときには、あなたはまともなサイズの本を持っていました)。カップルの可能性としては継承と戦略パターンがありますが、他にも多くのものがあります。 –

答えて

1

通常、C++では、クラスの宣言とその実装は2つの異なるファイルに格納されます。ヘッダーファイル(.h)には宣言のみが含まれ、.cppファイルには実装が含まれます。この分離の詳細については、この投稿:Separating class code into a header and cpp fileを参照してください。

さらに、同じインターフェイスの異なる実装を持つためには、最も簡単なアプローチは継承を使用することです。単純な例を以下に示します。

#include <vector> 
#include <iostream> 

// This could be in SensorInterface.h 
class SensorInterface 
{ 
    public: 

     virtual void initialize() = 0; 
     virtual void read() = 0; 
     virtual void write() = 0; 
}; 

// This could be in SensorImplementation1.h (for definitions) and  SensorImplementation1.cpp (for implementation) 
class SensorImplementation1 : public SensorInterface 
{ 
    public: 
      virtual void initialize() 
    { 
     std::cout << "SensorImplementation1::initialize" << std::endl; 
     // Here implementation 
    } 
      virtual void read() 
    { 
     std::cout << "SensorImplementation1::read" << std::endl; 
     // Here implementation 
    } 
      virtual void write() 
    { 
     std::cout << "SensorImplementation1::write" << std::endl; 
     // Here implementation 
    } 
}; 

// This could be in SensorImplementation1.h (for definitions) and SensorImplementation1.cpp (for implementation) 
class SensorImplementation2 : public SensorInterface 
{ 
    public: 
      virtual void initialize() 
      { 
     std::cout << "SensorImplementation2::initialize" << std::endl; 
        // Here implementation 
      } 
      virtual void read() 
      { 
     std::cout << "SensorImplementation2::read" << std::endl; 
        // Here implementation 
      } 
      virtual void write() 
      { 
     std::cout << "SensorImplementation2::write" << std::endl; 
        // Here implementation 
      } 
}; 

int main(int argc, char **argv) 
{ 
    std::vector<SensorInterface *> sensors; 

    SensorImplementation1 sensor1; 
    SensorImplementation2 sensor2; 

    sensors.push_back(&sensor1); 
    sensors.push_back(&sensor2); 

    for(unsigned int i = 0; i < sensors.size(); i++) 
    { 
     sensors.at(i)->initialize(); 
     sensors.at(i)->read(); 
     sensors.at(i)->write(); 
    } 

    return 0; 

} 
+0

これはまさに私が探していたものです。私はそれをテストします! – Ortix92

+0

派生関数にvirtualキーワードが必要とは思わない。正しい? – Ortix92

+0

ダイナミックディスパッチによる関数のオーバーライドを許可するには、仮想キーワードが必要です。 –

関連する問題