Singleton Klasse
-
Hallo allerseits,
bin seit 2 Tagen dabei das Buch "C++ für Spieleprogrammierer" von Heiko Kalista durchzuarbeiten und bin jetzt bei den Singletons angelangt.
So ganz erschließt sich mir jedoch nicht der Sinn der ganzen Sache.
Es gab folgenden Code dazu:#ifndef TSINGLETON #define TSINGLETON template <typename T> class TSingleton { protected: static T *m_pSingleton; public: TSingleton(void) { } virtual ~TSingleton(void) { } //create static object, if necessary inline static T* get() { if(!m_pSingleton) m_pSingleton = new T; return (m_pSingleton); } //delete static object static void del() { if(m_pSingleton) { delete (m_pSingleton); m_pSingleton = nullptr; } } }; //create static variable template <typename T> T* TSingleton<T>::m_pSingleton=0; #endifEingebaut wurde diese Klasse in eine andere Klasse namens CLogfile:
#pragma once #include "TSingleton.h" class CLogfile : public TSingleton<CLogfile> { public: CLogfile(void); ~CLogfile(void); void status(); };#include "Logfile.h" #include <iostream> CLogfile::CLogfile(void) { std::cout << "Neues Logfile wurde erstellt\n"; } CLogfile::~CLogfile(void) { std::cout << "Logfile wurde geschlossen\n"; } void CLogfile::status() { std::cout << "Status wurde ins Logfile geschrieben!\n"; }Die main dazu
#include <iostream> #include "Logfile.h" void function() { CLogfile::get()->status(); } int main() { function(); CLogfile::del(); return 0; }Mir geht's jetzt nicht darum, was das obige Beispiel genau tut, sondern darum, welchen Sinn und Zweck eine solche Singleton-Klasse erfüllt.
Wer toll wenn mir das jemand in einfachen Worten erklären und am besten mit einer Analogie verdeutlichen kann.
Vielen Dank
MfG
-
Es sieht mir doch ziemlich danach aus, dass schlicht verhindert werden soll, dass mehrere LogFiles existieren. Eine Klasse, die von Singleton erbt, kann somit nur einmal richtig erstellt werden. Analogien und Anwendungsbeispiele gibt es dafür genug, da fällt dir sicher auch schnell eins ein.
-
Und nur dafür ist sie gedacht? Also, dass man nur maximal 1 Instanz einer bestimmten Klasse erstellen kann?
-
Sorex schrieb:
Und nur dafür ist sie gedacht? Also, dass man nur maximal 1 Instanz einer bestimmten Klasse erstellen kann?
Das ist, wofür das Wort Singleton steht.
-
Sorex schrieb:
Und nur dafür ist sie gedacht? Also, dass man nur maximal 1 Instanz einer bestimmten Klasse erstellen kann?
Ja. Nur dafür und für sonst nichts. Singletons sind kein Ersatz für globale Variablen. Eigentlich. Aber naja, das ist nicht ganz wahr. In C++ läßt sich die Initialisierungsreihenfolge globaler Variablen aus verschiedenen Übersetzungeseinheiten nicht gerade elegant regeln. Selbst wenn es ginge, z.B. statische Prioritöten zu vergeben, dann wäre es immernoch extrem fehleranfällig, weil im Konstruktor der einen vielleicht mittelbar über 20 Funktionsaufrufe die andere benutzt wird und der arme Programmierer muß eine Ordnung da reinbringen.
Das Meyers-Singleton (oder das von oben) sorgt dafür, daß das Objekt erst unmittelbar vor der ersten Verwendung erzeugt wird und löst damit auch das Reihenfolge-Problem. Das ist aber nicht die heilige Lehre. Derzeit laufen Philosophie und Praxis der Singletons in C++ ein wenig auseinander.Beispiel aus der Praxis:
http://www.c-plusplus.net/forum/289990-13
-
Okay, die ganze Geschichte ist mir jetzt etwas klarer
danke euch