Template Singleton über DLL-Grenzen Problem
-
Hallo,
wir sind bis dato mit einem Template Singleton immer sehr gut gefahren. Das Singleton hat keine andere Funktion, als einen Zugriff auf die Template Klasse anzubieten und sieht ungefähr so aus:
template <class T_CLASS> class Singleton { public: static T_CLASS& GetInstance() { if (!g_pInstance) g_pInstance = new T_CLASS(); return *g_pInstance; } static void Destroy() { delete g_pInstance; } IMPEXP static T_CLASS * g_pInstance; protected: Singleton() {}; virtual ~Singleton() {}; private: Singleton( const Singleton& ); Singleton& operator=( const Singleton& ); };
Klassen haben davon geerbt und schon sind es Singletons (also nur wenn die ihre ctors verstecken, natürlich)
Nun aber das Problem, bei dieser Implementierung muss man in der jeweiligen CPP der Erben immer die Instanz erzeugen, via
MyNewSingleton* Singleton<MyNewSingleton>::g_pInstance = NULL;
bis dahin keine Raketenwissenschaft (Thread safety ist kein Thema hier). Ich kann über
MyNewSingleton foo = MyNewSingleton::GetInstance()
darauf zugreifen.
Nun das Problem: Das Singleton soll jetzt auch in einer anderen DLL eingesetzt werden.
Dort würde schreibt man wieder so etwas:MyOtherDLLSingleton* Singleton<MyOtherDLLSingleton>::g_pInstance = NULL;
Was den Compiler Error C2491 wirft.
Denn in der Definition von dllimport sind keine static Membervariablen erlaubt.
Schöne ******
Es gibt Konzepte, wie man über DLL Grenzen hinweg so etwas realisiert, in dem man die eigentliche Singleton-variable in einer CPP im anonymen Namespace deklariert.
Das Problem dort ist, dass das Singleton kein Template ist, sondern durch Funktionen erweitert wird, was in diesem Fall nicht wirklich geht und ich somit die Singleton Instanz Variable auch nicht in der cpp lokal deklarieren kann.Gibt es für das Problem eine praktikable Lösung? Ich kann das IMPEXP der g_pInstance nicht entfernen, weil ich dann über DLL Grenzen die Singletons aus der Base DLL auch nicht benutzen kann
-
Hi,
dann benutze alternativ das "Meyers Singleton" (s. z.B. http://fara.cs.uni-potsdam.de/~kaufmann/?page=GenCppFaqs&faq=Singleton (unten auf der Seite)):
class Singleton { public: static Singleton& GetInstance() { static Singleton Instance; return Instance; } }
-
Hab ich dann nicht in jeder cpp einen eigenen Pseudo Singleton?
Sagen wir eine Klasse A erbt von Singleton und Singleton ist in Singleton.hpp definiert.
Und jetzt included Klasse B und Klasse C die Klasse A und somit auch Singleton.hpp in deren eigenen Translation Units und bei der Benutzung würde doch ein Singleton von A sowohl in B als auch in C erzeugt, die aber nichts mit einander zu tun haben, oder?
-
Ich kann dir nur von ganzem Herzen dazu raten keine Singletons zu benutzen. Dann verschwinden auch all deine Probleme...