Alt 07.05.2011, 12:02:24   #1 (permalink)
Erfahrener Benutzer
Benutzerbild von robert

ID: 18683
Lose-Remote

Reg: 28.04.2006
Beiträge: 417
robert kann auf vieles stolz seinrobert kann auf vieles stolz seinrobert kann auf vieles stolz seinrobert kann auf vieles stolz seinrobert kann auf vieles stolz seinrobert kann auf vieles stolz seinrobert kann auf vieles stolz seinrobert kann auf vieles stolz seinrobert kann auf vieles stolz sein
Standard Singleton in mehreren Projekten per DLL nutzen *gelöst*

Hallo,

ich bin gerade dabei ein unter MacOS funktionsfähiges Projekt unter Windows zu kompilieren.
Das Projekt ist Modular in Bibliotheken (unter Win jetzt DLLs) gegliedert. In einer DLL (nennen wir sie mal CommonDLL) befinden sich von allen Komponenten gemeinsam genutzer Code.

Darunter ist u.a. auch ein Singleton-Template

singleton.h
Code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
template <class T> class IMEXP Singleton { public: static T* Get() { if(!m_Instance) m_Instance = new T; return m_pInstance; } protected: Singleton(){} ~Singleton(){} private: Singleton(Singleton const&); Singleton& operator=(Singleton const&); static T* m_pInstance; }; template <class T> T* Singleton<T>::m_Instance=NULL; #endif
Innerhalb dieser CommonDLL gibt es dann die konkrete Klasse, die als Singleton fungieren soll (ClassXY.h / ClassXY.cpp).

In ClassXY.h wird dann das Singleton aus der Klasse per typedef definiert.
Code:
1:
2:
3:
4:
5:
6:
#include "singleton.h" class IMEXP ClassXY { // }; typedef Singleton<ClassXY> SingletonClassXY;
.

Innerhalb der CommonDLL wird dann auf die Instanz per SingletonClassXY::Get() zugegriffen. Das gleiche auch in den Komponenten, die die CommonDLL nutzen.

Das Problem: Jede Komponente hat sein eigene SingletonClassXY-Instanz. Jeder Aufruf von Get() führt in jeder Komponente also dazu, dass eine neue Instanz erzeugt wird.

Lösung:
Der Singleton-Code darf nicht mehrfach erzeugt werden und das geht wohl mit __declspec(dllexport) bzw. __declspec(dllimport). Allerdings habe ich es noch nicht geschafft.

In der ClassXY.h habe ich folgendes hinzugefügt:
Code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
#ifdef WIN32 #ifdef EXPORTS #define IMEXP __declspec(dllexport) #define EXPIMP_TEMPLATE #else #define IMEXP __declspec(dllimport) #define EXPIMP_TEMPLATE extern #endif #else #define IMEXP #endif //... EXPIMP_TEMPLATE template class IMEXP Singleton<ClassXY>; typedef IMEXP Singleton<ClassXY> SingletonClassXY;
In ClassXY.cpp habe ich dann ein
Code:
1:
#define EXPORTS
gesetzt.

Allerdings bleibt das Problem nach wie vor bestehen.

edit:

Habs jetzt hinbekommen. Die Änderungen hab ich mal rot hinzugefügt.

Die Prärpozessordirektiven (ab #ifdef EXPORTS ...) müssen irgendwo zentral liegen und entsprechend erweitert werden um das Schlüsselwort "extern" bei Bedarf hinzufügen zu können. Auch das Singleton muss dann mit __declspec(dllexport) gekennzeichnet werden.

Ganz wichtig auch diese Zeile:
EXPIMP_TEMPLATE template class IMEXP Singleton<ClassXY>;

Aber rein aus Interesse: Warum ging das unter MacOS? Ist das shared Library-Prinzip dort anders? Weiß das jemand?

Geändert von robert (07.05.2011 um 19:03:16 Uhr)
robert ist offline   Mit Zitat antworten
Antwort

Gesponsorte Links

Anzeige


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 
Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind an
Pingbacks sind an
Refbacks sind an


Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
[V] Günstige Paidbanner/Paidlinks/Autosurf-View/Paidmails/ect auf mehreren Projekten Promizock Lose4Werbung 6 03.04.2009 02:38:23
Liste von GPL Projekten Papenburger Scripts & Software 1 30.06.2008 21:36:41
[V]Paidmailpakete & Forcedklicks auf 4 Projekten! Top-Mailer.de Lose4Werbung 9 19.11.2007 16:10:53
Slots in mehreren Fenstern spielen - Nutzen?! Jipii Lose-Talk 21 21.10.2006 08:46:03
Allgemeine Frage zu Projekten. renner Lose-Talk 4 16.10.2006 00:14:27


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:24:11 Uhr.