我想拥有DLLInterface类的多个实例,但是因为每个对象都有指向相同DLL函数的指针,所以我希望它们是静态的。
以下代码无法编译。 (我确实有理由需要包含相同指针的多个实例,下面的精简代码没有说明。)
//Header file:
typedef void (*DLLFunction)();
class DLLInterface
{
private:
static HINSTANCE hinstDLL;
public:
static DLLFunction Do;
DLLInterface()
{
if(!hinstDLL || !Do)
{
hinstDLL = LoadLibrary("DoubleThink.dll");
Do = (DLLFunction)GetProcAddress(hinstDLL, "Do");
}
}
};
我还需要在此头文件中包含所有代码。 (我知道我可以通过在EXE上的cpp文件中添加如下语句来编译它,但我需要避免这样做。
HINSTANCE DLLInterface :: hinstDLL = 0;
谢谢!
答案 0 :(得分:1)
我能想到的一个技巧是使用模板。我们的想法是让类包含静态数据一个模板类,然后从中派生出具有某种特定类型的实际类:
template <class T>
class DLLInterfaceImpl;
{
private:
static HINSTANCE hinstDLL;
public:
static DLLFunction Do;
};
template <class T>
HINSTANCE DllInterfaceImpl<T>::hInstDLL;
template <class T>
DLLFunction DllInterfaceImpl<T>::Do;
class DllInterface : public DllInterfaceImpl<int>
{
};
因为DllInterfaceImpl是一个模板,你可以将静态定义放在头文件中,编译器会做一些“技巧”,这样多个定义就不会导致链接失败。