2010-12-19 12 views
2

特定のハードウェア、ファームウェア、およびドライバに依存するクラスへの参照を取るC++コードを書いています。私はテストのためのインターフェイスをスタブアウトしたいと思いますが、私に困惑しているロードブロッキングがいくつかあります。私がインターフェースしているクラスは自動生成されているので、インターフェースを定義する基本クラスから継承することはできません。私が呼び出す必要のあるメソッドは仮想ではないので、私のテストスタブはそれを継承してメソッドをオーバーライドできません。任意のタイプのクラステンプレートへの参照を取る

私は、テンプレート化されたラッパークラスを作成して、それが入力されたクラスにコールをリダイレクトするだけでよいことに気付きました。私は次のようなものを持っています...

template< class T > 
class DriverInterface 
{ 
    public: 
     DriverInterface(T& driverImpl): 
     m_driverImpl(driverImpl) 
     { 
     } 

     virtual ~DriverInterface(void) 
     { 
     } 

     virtual void GetDataBuffer(char *&pData, int &bufLen) 
     { 
      m_driverImpl.GetDataBuffer(pData, bufLen); 
     } 

     virtual void WriteDataBuffer(char *pData, int bufLen) 
     { 
      m_driverImpl.WriteDataBuffer(pData, bufLen); 
     } 
    protected: 
     T& m_driverImpl; 

    private: 
}; 

class DriverWriter 
{ 
    public: 
     DriverWriter(DriverInterface& driverInterface); 
    //etc 
} 

残念なことにコンパイラはDriverWriterクラスのDriverInterfaceに型パラメータを指定したいと思っています。型を指定する必要がないようにコードを再構成する方法はありますか?

答えて

7

それを解決するための一般的な方法は、テンプレートパラメータに依存しない、独自のインターフェイスに仮想関数を考慮することです:

class DriverInterfaceBase 
{ 
    public: 
     virtual ~DriverInterfaceBase(void) { } 

     virtual void GetDataBuffer(char *&pData, int &bufLen) = 0; 
     virtual void WriteDataBuffer(char *pData, int bufLen) = 0; 
}; 

// Derive from it: 
template< class T > 
class DriverInterface : public DriverInterfaceBase 

あなたはその後、

class DriverWriter 
{ 
    public: 
     DriverWriter(DriverInterfaceBase& driverInterface); 
    //etc 
}; 
+0

1を書くことができます。まさに私が言うつもりだった。 – Puppy

+0

ありがとうございます。今明らかになったようですが、私は確かに解決策を見ることができませんでした。 – effnish