Синглтон в DLL?

Итак, я пытаюсь экспортировать что-то в проект в 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 в рабочей среде. У кого-нибудь есть идеи?


person UberJumper    schedule 14.10.2009    source источник
comment
Точная копия: stackoverflow.com/questions/738933/multiple-singleton-instances   -  person Martin York    schedule 14.10.2009


Ответы (1)


См. раздел Несколько экземпляров Singleton.

Вам нужно будет убедиться, что создание экземпляра вашего шаблона выполняется в одной единице компиляции, и вам нужно будет переместить указатель = инициализация NULL в файл CPP. В других DLL вам придется использовать extern шаблоны.

Редактировать: Если вы застряли с получением шаблонных синглетонов для работы с несколькими DLL, вы также можете определить короткую функцию-оболочку, которая возвращает ваш экземпляр синглтона, чтобы создание экземпляра шаблона выполнялось только в одной единице компиляции.

Пример:

template class Singleton<T>;
__declspec(dllexport/dllimport) T& getInstanceForMyType();
// in the cpp file:
T& getInstanceForMyType()
{
    return Singleton<MyType>::getInstance();
}
person MP24    schedule 14.10.2009
comment
Но внешние шаблоны в настоящее время не реализованы в MSVC. Как это можно сделать иначе. Я посмотрел ветку. Как я могу справиться с этим? - person UberJumper; 14.10.2009
comment
Я думаю, что это работает, по крайней мере, если включены расширения Microsoft. Возможно, вам придется дополнительно совместить его с declspec dllimports/exports. Помните, что определение указателя должно быть в файле CPP. - person MP24; 14.10.2009
comment
@uberjumper: это решение для создания экземпляра класса шаблона и экспорта/импорта этого экземпляра в/из DLL. Это не имеет ничего общего с внешними шаблонами. Тем не менее... код класса шаблона должен быть полностью виден во время компиляции. - person Cătălin Pitiș; 16.10.2009