辛格尔顿在一个DLL?(Singleton in a DLL?)

2019-07-28 18:57发布

因此,我试图出口出头在项目中的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在一个工作环境的工作。 有没有人有什么想法?

Answer 1:

请参阅多辛格尔顿实例

你必须确保你的模板实例在一个编译单元完成后,你将有指针= NULL初始化移动到CPP文件。 在其他DLL,你将不得不使用extern的模板。

编辑:如果你被卡住越来越模板单身到多个DLL工作过,你也可以定义,使模板实例只在一个编译单元进行返回您的单个实例很短的包装函数。

例:

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


文章来源: Singleton in a DLL?