Singelton Implementation in C++
-
hi,
ich versteh diesen quelltext (von wikipedia) nicht ganz:Wo wird die static variable
instanceüberhaupt initialisiert? Und warum ist sie nicht für die ganze Klasse static?class Singleton { private: //Konstruktor private, damit man sich keine Instanzen holen kann. Singleton(); //Den Kopierkonstruktor schützen um zu vermeiden, dass das Objekt unbeabsichtigt kopiert wird. Singleton(const Singleton& cc); public: ~Singleton(); static Singleton* getInstance(); }; Singleton* Singleton::getInstance() { static Singleton instance; return &instance; };http://de.wikipedia.org/wiki/Singleton_(Entwurfsmuster)#Implementierung_in_C.2B.2B
danke schon mal!
-
Die Initialisierung passiert in der Memberfunktion getInstance, wo die statische Variable instance erzeugt wird. Da diese static ist, passiert das genau einmal, nämlich bei dem erstem Aufruf. Ab dann wird lediglich die Referenz auf das Objekt zurückgegeben. Das funktioniert so, wegen dem static, dass die lokale Variable statisch (also während des gesammten Programmes verfügbar) macht. Die Konsequenz ist dann halt, dass du genau nur ein Objekt von diesem Typ haben kannst. (Was ja genau der Sinn einges Singletons ist).
Das ist übrigens das Meyers Singleton. Das sollte aber im Wiki Artikel stehen, aber wenn du nach dem Begriff suchst, dann findest du noch mehr Informationen dazu.
-
ah verstehe... (sorry, ich bin nicht so fit in c++)
und warum wird diese static-Variable automatisch erzeugt? also ohne Aufruf von
= new Singelton();
Das liegt wohl daran dass instance static ist? und dann wird wohl der Standardkonstruktor verwendet?in wikipedia gar nichts von "meyers", aber jetzt kann ich auch besser selber danach suchen.
Dankeschön!
-
Ja. *schnipp*
Ich revidiere das da oben, falls du das bereits gesehen hast.
Grundsätzlich hat sie zwar schon gestummen, aber die Begriffe waren falsch. Aber wichtig ist hier, dass die statische Variable bis ans Ende des Programmes vorhanden ist, wenn sie einmal initialisiert ist.
-
jakob190590 schrieb:
Das liegt wohl daran dass instance static ist? und dann wird wohl der Standardkonstruktor verwendet?
Hat nichts mit static zu tun, sondern es wird immer der Standardkonstruktor aufgerufen wenn nicht anders angegeben:
MeineKlasse c; // Ruft standardctor auf MeineKlasse c(123); // Ruft ctor mit int als argument auf
-
jakob190590 schrieb:
und warum wird diese static-Variable automatisch erzeugt? also ohne Aufruf von
= new Singleton();
Das liegt wohl daran dass instance static ist? und dann wird wohl der Standardkonstruktor verwendet?new Singleton(); schreibt meines Wissens nach ein Objekt vom Typ Singleton in den RAM, ruft den Konstruktor auf und gibt dann einen Zeiger auf das Objekt zurück. Du müsstest also new Singleton(); nur schreiben, wenn du einen Singleton* initialisieren willst.
-
wxSkip schrieb:
new Singleton(); schreibt meines Wissens nach ein Objekt vom Typ Singleton in den RAM, ruft den Konstruktor auf und gibt dann einen Zeiger auf das Objekt zurück. Du müsstest also new Singleton(); nur schreiben, wenn du einen Singleton* initialisieren willst.
ah ok. das war auch mein Problem; Bei Java gibt es ja keine Unterscheidung zwischen
Singleton*undSingleton;
Bei Java muss man immer initialisieren mitSingleton s = new Singleton();ok, bei C++ muss man also nur Zeiger (
Singleton* s) intialisieren - Variablen (Singleton s) werden automatisch initialisiert.Danke!