Singelton(Prüfen ob Objekt schon erstellt)
-
Morgen allerseits,
hoffe ihr habt schon fleißig Kaffee dastehen um den Tag gut zu starten.
Ok nun zu meinem Problem. Ich habe aus einem Tutorial eine einfache Singelton Klasseclass Singleton { private: // Standard- und Copykonstruktor sind private. // Nur Methoden dieser Klasse können auf sie zugreifen. Singleton() {}; Singleton(const Singleton&); // Es gibt nur eine Instanz. Jede Zuweisung wäre eine Selbstzuweisung. // Da Selbstzuweisungen selten Sinn machen, ist der op= privat Singleton& operator=(const Singleton&); public: // Diese statische Methode erzeugt die einzige Instanz. // Nur über diese Methode erhalten Anwender den Zugriff auf // die Instanz. static Singleton& GetInstanz() { // Die Instanz wird erst beim ersten Aufruf erzeugt. // Endet das Programm, wird Instanz vernichtet. static Singleton Instanz; return Instanz; } };Meine Frage ist folgende, wenn ich nun GetInstanz aufrufe, wird ja ein Objekt erzeugt. Sinn und zweck der Singelton ist ja das die Instanz nur einmal erzeugt wird. Nun dachte ich mir, wo wird in dieser Klasse bei der Instanzierung überprüft ob nicht schon eine Instanz erzeugt wurde?? Daher meine Frage, wie kann ich überprüfen ob schon eine Instanz erzeugt wurde?
-
static Singleton Instanz;sorgt dafür das es nur eine instanz gibt :), deshalb muss da keine Überprüfung rein.
Falls du mal mit Threads arbeitest solltest du vorsichtig sein, wenn es sein kann das dein singleton von mehreren threads verwendet und erstellt wird.
BR
Vinzenz
-
Firefighter schrieb:
Meine Frage ist folgende, wenn ich nun GetInstanz aufrufe, wird ja ein Objekt erzeugt. Sinn und zweck der Singelton ist ja das die Instanz nur einmal erzeugt wird. Nun dachte ich mir, wo wird in dieser Klasse bei der Instanzierung überprüft ob nicht schon eine Instanz erzeugt wurde??
Das braucht nicht überprüft werden. Die statischen Variablen innerhalb einer Funktion werden beim ersten Aufruf der Funktion angelegt und bleiben dann bis zum Programmende bestehen*****. Alle weiteren Aufrufe greifen dann immer auf die beim ersten Durchlauf angelegte Variable zu.
Daher meine Frage, wie kann ich überprüfen ob schon eine Instanz erzeugt wurde?
Ohne Zusätze meines Wissens garnicht. Mir ist zumindest keine Möglichkeit bekannt, mit der man herausfinden kann ob eine statische Variable innerhalb einer Funktion bereits existiert, d.h. ob eine Funktion schon einmal aufgerufen worden ist. Du könntest natürlich ein bool als satischen Member anlegen und diesen dann beim ersten Zugriff setzen. Fragt sich allerdings warum du das tun solltest...
_______________________
***** Wenn man mehrere derartige Singletons benutzt sollte man darauf achten dass die in ihren Destruktoren nicht aufeinander Bezug nehmen, da man nicht beeinflussen kann, in welcher Reihenfolge sie zerstört werden. Alexandrescu beschreibt ein seinem Modern C++ Design einen Phönix-Singleton, der allerdings gewissen Beschränkungen unterliegt.
-
alles klar, das hat alles gesagt, danke für die ausführliche Hilfe, einen schönen Tag an alle
