DLL中的单例?

时间:2009-10-14 15:11:51

标签: c++ dll singleton

所以我试图将项目中的某些东西导出到DLL。无论如何,一些项目非常重视单例类。

template <typename T>
class DLL_IMP VA_Singleton {
protected:
    VA_Singleton () {};
    ~VA_Singleton () {};
public:
    static T *Get(){
        return (static_cast<T*> (a_singleton));
    }
    static void Delete(){
        if(a_singleton == NULL) {
            delete a_singleton;
        }
    }
    static void Create(){
        a_singleton = GetInstance();
        if(a_singleton == NULL){
           a_singleton = new T;
        }
    }
private:
    static T *a_singleton;
};

template <typename T> T *VA_Singleton<T>::a_singleton = NULL;

我的导出工作正常,但在导入时说明:

template <typename T> T *VA_Singleton<T>::a_singleton = NULL;

不适用于DLLImport。这是我第一次在工作环境中使用DLL。有没有人有任何想法?

1 个答案:

答案 0 :(得分:2)

请参阅Multiple Singleton Instances

您必须确保在一个编译单元中完成模板实例化,并且必须将指针= NULL初始化移动到CPP文件。在其他DLL中,您必须使用extern模板。

修改 如果您不得不让模板化的单例在多个DLL上工作,您还可以定义一个返回单例实例的短包装函数,以便模板实例化仅在一个编译单元中完成。

示例:

template class Singleton<T>;
__declspec(dllexport/dllimport) T& getInstanceForMyType();
// in the cpp file:
T& getInstanceForMyType()
{
    return Singleton<MyType>::getInstance();
}