Singleton



  • Hallo, bin gerade am C++ lernen und dabei auf "singleton" gestoßen.
    Verstehe nicht genau was das ganze jetzt macht und wozu es gut ist.
    Hier mal der Code aus der .hpp Datei:

    #ifndef TSINGLETON
    #define TSINGLETON
    
    template <class T>
    class TSingleton
    {
    protected:
    	//Membervariablen
    	static T *m_pSingleton;	//Statisches Objekt
    
    public:
    
    	//Memberfunktionen
    
    	//Destruktor
    	//
    	virtual ~TSingleton()
    	{
    	}
    
    	//Get
    	//
    	//Aufgabe: Wenn nötig, statisches Objekt erzeugen und
    	//Zeiger darauf zurückgeben
    	//
    	inline static T* Get()
    	{
    		//Existiert schon eine Instanz?
    		if (!m_pSingleton)
    			m_pSingleton = new T;	//Nein, dann neue Instanz erzeugen
    
    		//Zeiger auf die Instanz zurückgeben
    		return (m_pSingleton);
    
    	}//Get
    
    	//Statisches Objekt freigeben
    	//
    	static void Del()
    	{
    		//Gab es eine Instanz?
    		if (m_pSingleton)
    		{
    			delete (m_pSingleton);	//Ja, dann freigeben
    			m_pSingleton = NULL;	//und Zeiger auf NULL setzen
    		}
    
    	}//Del
    
    };
    
    //Die statische Variable erzeugen
    //
    template <class T>
    T *TSingleton<T>::m_pSingleton = 0;
    
    #endif
    


  • Probier mal davon eine Instanz zu erstellen (oder mehrere). 😉

    Eine bessere Implementierung gibt es hier: (+Erklärung, falls du es nicht selbst drauf kommst, was speziell daran ist)
    http://en.wikipedia.org/wiki/Singleton_pattern#C.2B.2B



  • hmmm...also wenn ich genau eine Instanz erstelle, läuft alles
    glatt, sobald ich mehr Instanzen erstelle, bekomme ich Fehlermeldungen.

    error C2039: 'Get' : is not a member of '`global namespace''
    error C2588: '::!Get' : illegal global finalizer

    Also sorgt Singleton dafür, dass ich nur eine Instanz der Klasse
    erstellen kann aber ich verstehe nicht was genau mir das bringen soll.
    Was ist der Vorteil daran, erkenne das nicht.



  • Lybrial schrieb:

    Also sorgt Singleton dafür, dass ich nur eine Instanz der Klasse
    erstellen kann aber ich verstehe nicht was genau mir das bringen soll.
    Was ist der Vorteil daran, erkenne das nicht.

    Der Vorteil daran ist, dass nur eine Instanz erstellt werden kann. 🤡

    Dieses Verhalten kann manchmal von Vorteil sein, weil es logisch gesehen nicht angebracht ist, mehrere Objekte zu haben. Zum Beispiel für einen globalen Logger. Was aber nicht heisst, dass jede einzigartige Klasse gleich zum Singleton gemacht werden soll. Man zahlt dafür einen hohen Preis.



  • Also immer wenn ich UNBEDINGT nur eine einzige Instanz von
    einer Klasse erstellen möchte, wende ich so ein Singleton an?

    Das Ding schützt mich also lediglich davor das ich "ausversehen"
    noch eine Instanz erstelle oder wie soll ich das verstehen?
    ich weiß doch eigentlich wie viele Instanzen ich erstelle und
    wie ich sie verwenden möchte^^



  • Nexus schrieb:

    Man zahlt dafür einen hohen Preis.

    In wie fern?



  • Ein Singleton ist eine verbesserte globale Variable. Das ist zwar nicht der Primärzweck, aber eben ein unumgänglicher Nebeneffekt, wenn man mit static -Methoden arbeitet.

    Wenn man während des Programms höchstens eine Instanz haben darf und eine Compilezeit-Garantie dafür möchte, ist das Singleton eine Möglichkeit. Der Vorteil gegenüber einer herkömmlichen globalen Variable besteht in der Kapselung (man kann Zugriffe überwachen) und Flexibilität (man kann z.B. Initialisierung/Zerstörung explizit steuern). Nimm die Logger-Klasse. Wenn einem das globale Objekt std::clog nicht ausreicht, kann man beispielsweise ein Singleton drum herum packen und Zusatzfunktionalität einbauen.

    Aber wie gesagt: Singletons musst du mit Bedacht einsetzen. Sie bringen einige Probleme mit sich, z.B. enorme Abhängigkeiten und die Tendenz, bei übermässigem Einsatz sauber strukturiertem Design (wo für die einzelnen Klassen genau festgelegt ist, wen sie kennen und mit wem sie interagieren dürfen) entgegenzuwirken. Auch sind globale/statische Objekte manchmal ein Problem wegen der Lebensdauer und Threadsicherheit. Singleton-Headerdateien, die zu oft eingebunden werden, können die Kompilierzeit erhöhen, und bei zentralen Änderungen Rekompilierungsvorgänge von Clientcode erzwingen.



  • Okay Danke, ich denke ich habs begriffen 😉
    Hab gerade erst angefangen mit C++ und da war
    das grad nen harter Brocken^^


Anmelden zum Antworten