Frage zum Singleton
-
Hallo
Hab schon verschiedene Implementationen gesehen, aber welche ist nun die "beste"?
Im Moment mach ich das immer so:class Beispiel { public: Beispiel& instanz() { Beispiel inst; return inst; } void eineMethode(); private: Beispiel(){}; // plus Kopierkonstruktor und Zuweisung (op=) };Und dann Aufruf mit
Beispiel::instanz().eineMethode();Geht das nicht eleganter?
Gruss
Jan
-
naja, das ist kein Singleton, denn man kann ja beliebig viele Instanzen der Klasse anlegen.
Abgesehen davon gibt instanz() eine Adresse eines lokalen Stackobjektes zurück, also crash...
-
jeder aufruf von instanz erzeugt ein lokales objekt und gibt dessen adresse zurück. das lokale objekt inst wird aber bei verlassen der methode instanz() zerstört. viele compiler geben da auch nen warning aus.
konstruktor private ist richtig, um instanziierung zu verhindern.
ein simples singleton modell sieht ungefähr so aus:
class Singleton { private: static Singleton* instance; Singleton(); public: Singleton* getInstance(); }; ... Singleton* Singleton::instance = 0; Singleton::Singleton() {} Singleton* Singleton::getInstance() { if(!instance) instance = new Singleton; return instance; }
-
Ich depp, habs static vergessen, sorry
class Beispiel { public: static Beispiel& instanz() { static Beispiel inst; return inst; } void eineMethode(); private: Beispiel(){}; // plus Kopierkonstruktor und Zuweisung (op=) };
-
Hallo,
Ich bevorzuge das hier (mit Wächterklasse)
http://www.oop-trainer.de/Themen/Singleton.html
-
welchen tieferen zweck erfüllt die wächterklasse? imo wird der destruktor erst bei programm termination aufgerufen, wenn sowieso dynamisch allokierter speicher freigegeben wird.
-
Nenn mich altmodisch, aber ich möchte genau wissen wann welcher Speicher freigegeben wird und das auch zur Not noch debuggen können.
-
hehe, ok. das ergibt sinn
