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: 48 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 |
|
|
|