| Vorheriges Thema anzeigen :: Nächstes Thema anzeigen | 
	
	
		| Autor | Nachricht | 
	
		| Maxim Senior JLI'ler
 
 
 
 Anmeldedatum: 28.03.2004
 Beiträge: 249
 
 Medaillen: Keine
 
 
 | 
			
				|  Verfasst am: 24.03.2006, 18:09    Titel: Singleton + DLL = Problem |   |  
				| 
 |  
				| Hallo! 
 Ich habe eine Singleton-Klasse A in einer DLL. Die Instanz von A wird in dem DLL Code erzeugt. Wenn ich aber jetzt in main() auf A zugreifen will, gibt es einen assert -Fehler, da angeblich noch keine Instanz von A angelegt wurde.
 Ich vermute, dass es daran liegt, dass die DLL und das Hauptprogramm verschiedene Speicherbereiche nutzen und dass es in irgendwelcher Weise zu Problemen führt.
 
 Weiß jemand wie man trotzdem eine Singleton-Klasse in Verbindung mit einer DLL benutzen kann?
 
 Singleton-Schablone:
 
  	  | CPP: |  	  | #include <cassert> 
 #ifndef _PG_SINGLETON_
 #define _PG_SINGLETON_
 
 
 template <typename T>
 class Singleton
 {
 static T* ms_Singleton;
 
 public:
 Singleton(void)
 {
 
 if(!ms_Singleton == 0)
 {
 assert( !ms_Singleton);
 return;
 }
 
 #if defined( _MSC_VER ) && _MSC_VER < 1200
 int offset = (int)(T*)1 - (int)(Singleton <T>*)(T*)1;
 ms_Singleton = (T*)((int)this + offset);
 #else
 ms_Singleton = static_cast< T* >( this );
 #endif
 
 }
 
 ~Singleton(void)
 {
 assert(ms_Singleton);
 ms_Singleton = 0;
 }
 
 static T& GetSingleton(void)
 {
 assert(ms_Singleton);
 return (*ms_Singleton);
 }
 
 static T* GetSingletonPtr(void)
 {
 return ms_Singleton;
 }
 };
 
 
 
 template <typename T> T*  Singleton <T>::ms_Singleton = NULL;
 
 #endif
 | 
 
 Mfg Maxim
 |  | 
	
		| Nach oben |  | 
	
		|  | 
	
		| Christian Rousselle Site Admin
 
  
 Alter: 49
 Anmeldedatum: 19.07.2002
 Beiträge: 1630
 
 Medaillen: Keine
 
 
 | 
			
				|  Verfasst am: 25.03.2006, 12:26    Titel: |   |  
				| 
 |  
				| Suchfunktion -> Thema gab es schon einige Male. Schreib dir eine Funktion in der DLL, die einen Zeiger auf die Singletonklasse zurückgibt. |  | 
	
		| Nach oben |  | 
	
		|  | 
	
		| DirectXer Dark JLI'ler
 
  
 
 Anmeldedatum: 05.02.2005
 Beiträge: 1201
 Wohnort: Köln
 Medaillen: Keine
 
 
 | 
			
				|  Verfasst am: 25.03.2006, 12:29    Titel: |   |  
				| 
 |  
				| ich bin mir net sicher obs was damit zu tun hat, aber ich würde das Singletondesign bei dir ändern, also ungefähr in diese richtung (mit Konstruktor = private) 
  	  | CPP: |  	  | class Singleton {
 public:
 inline static Singelton* getInstance(void)
 {
 if( !instance )
 instance = new Singleton;
 
 return instance;
 }
 
 static void destroyInstance(void)
 {
 if( instance )
 {
 delete instance;
 instance = NULL;
 }
 }
 
 private:
 Singleton(void);
 Singleton(const Singleton& copy);
 ~Singleton(void);
 Singleton& operator= (Singleton& next);
 
 static Singleton* instance;
 };
 
 Singleton::instance = NULL;
 | 
 habs jetz ma so ausm kopf gemacht, kann sein das kleine rechtschreibfehlfer drin sind...
   
 Gruß DirectXer
 |  | 
	
		| Nach oben |  | 
	
		|  | 
	
		| Maxim Senior JLI'ler
 
 
 
 Anmeldedatum: 28.03.2004
 Beiträge: 249
 
 Medaillen: Keine
 
 
 | 
			
				|  Verfasst am: 26.03.2006, 13:04    Titel: |   |  
				| 
 |  
				|  	  | Christian Rousselle hat Folgendes geschrieben: |  	  | Suchfunktion -> Thema gab es schon einige Male. | 
 Wo?
 
 
  	  | Christian Rousselle hat Folgendes geschrieben: |  	  | Schreib dir eine Funktion in der DLL, die einen Zeiger auf die Singletonklasse zurückgibt.
 | 
 Dann kann ich ja gleich die Singletons wegwerfen. Das ist ja nicht der Sinn der Sache!
 |  | 
	
		| Nach oben |  | 
	
		|  | 
	
		| DirectXer Dark JLI'ler
 
  
 
 Anmeldedatum: 05.02.2005
 Beiträge: 1201
 Wohnort: Köln
 Medaillen: Keine
 
 
 | 
			
				|  Verfasst am: 26.03.2006, 13:10    Titel: |   |  
				| 
 |  
				| ich glaube, Christian meinte, dass du diese Funktion in der DLL ungefähr so machen solltest. Bei meinem Beispiel sähe dass dann so aus: 
 
  	  | CPP: |  	  | Singleton* singletonInstance(void) {
 return Singleton::getInstance();
 }
 | 
 
 also die instanz von außen zurückgeben und darauf zugreifen, damit behältst du das singletonkonzept bei, hast diese Vorteile und musst zusätzlich weniger schreiben, also du musst das Singleton:: net immer voranstellen
 
 Gruß DXer
 |  | 
	
		| Nach oben |  | 
	
		|  | 
	
		|  |