我正在编写 C++ 代码,该代码引用依赖于特定硬件、固件和驱动程序的类。我想去掉用于测试的接口(interface),但有几个障碍让我感到困惑。我连接的类是自动生成的(不是我的想法)所以我不能让它从定义接口(interface)的基类继承。我需要调用的方法不是虚拟的,因此我的测试 stub 无法继承它并覆盖这些方法。
我突然想到我可以创建一个模板化的包装器类,然后将调用重定向到它所键入的类。我会有类似...
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 上指定一个类型参数。有没有一种方法可以重构代码,这样我就不需要指定类型了?
最佳答案
解决它的一种常见方法是将虚函数分解到它们自己的不依赖于模板参数的接口(interface)中:
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
};
关于c++ - 引用任何类型的类模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4484076/