2010-12-19 192 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 2010-12-19 17:16:27

+0

謝謝。現在看來很明顯,但我當然看不到解決方案。 – effnish 2010-12-19 17:29:24