2010-12-19 105 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