JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.php?sid=cb2c206a267e229de6bf16db03cfcd37Medaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

Singleton + DLL = Problem

 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Maxim
Senior JLI'ler



Anmeldedatum: 28.03.2004
Beiträge: 249

Medaillen: Keine

BeitragVerfasst am: 24.03.2006, 18:09    Titel: Singleton + DLL = Problem Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Christian Rousselle
Site Admin


Alter: 48
Anmeldedatum: 19.07.2002
Beiträge: 1630

Medaillen: Keine

BeitragVerfasst am: 25.03.2006, 12:26    Titel: Antworten mit Zitat

Suchfunktion -> Thema gab es schon einige Male. Schreib dir eine Funktion in der DLL, die einen Zeiger auf die Singletonklasse zurückgibt.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
DirectXer
Dark JLI'ler



Anmeldedatum: 05.02.2005
Beiträge: 1201
Wohnort: Köln
Medaillen: Keine

BeitragVerfasst am: 25.03.2006, 12:29    Titel: Antworten mit Zitat

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... Rolling Eyes

Gruß DirectXer
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Maxim
Senior JLI'ler



Anmeldedatum: 28.03.2004
Beiträge: 249

Medaillen: Keine

BeitragVerfasst am: 26.03.2006, 13:04    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
DirectXer
Dark JLI'ler



Anmeldedatum: 05.02.2005
Beiträge: 1201
Wohnort: Köln
Medaillen: Keine

BeitragVerfasst am: 26.03.2006, 13:10    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung Alle Zeiten sind GMT
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.


Powered by phpBB © 2001, 2005 phpBB Group
Deutsche Übersetzung von phpBB.de

Impressum