2009-10-14 8 views
2

Donc j'essaye d'exporter quelque chose dans un projet à DLL. Quoi qu'il en soit, quelques projets utilisent très fortement une classe singleton.Singleton dans une 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; 

j'ai eu l'exportation fonctionne bien, mais quand il vient à l'importer indique ceci:

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

ne fonctionne pas avec DLLImport. C'est la première fois que je travaille vraiment avec des DLL dans un environnement de travail. Quelqu'un a-t-il une idée?

+0

double exact: http://stackoverflow.com/questions/738933/multiple-singleton-instances –

Répondre

2

S'il vous plaît voir Multiple Singleton Instances

Vous devez vous assurer que votre modèle instanciation se fait dans une unité de compilation, et vous devrez déplacer le pointeur NULL = initialisation du fichier au RPC. Dans d'autres DLL, vous devrez utiliser les modèles extern.

Edit: Si vous êtes coincé à obtenir singletons templated travailler sur plusieurs DLL, vous pouvez définir également une fonction courte wrapper qui retourne votre instance singleton de telle sorte que le modèle instanciation se fait dans une unité de compilation uniquement.

Exemple:

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

Mais les modèles externat ne sont pas mis en œuvre actuellement à MSVC. Comment cela peut-il être fait autrement. J'ai regardé le fil. Comment puis-je y faire face? – UberJumper

+0

Je pense que cela fonctionne, au moins si les extensions Microsoft sont activées. Vous devrez également le combiner avec dllimports/exports 'declspec', probablement. N'oubliez pas que la définition du pointeur doit figurer dans le fichier CPP. – MP24

+0

@uberjumper: Ceci est la solution pour instancier une classe de template et exporter/importer cette instance depuis/vers une DLL. Cela n'a rien à voir avec les modèles externes. Encore ... le code de la classe template doit être entièrement visible au moment de la compilation. –