Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Singleton-Klasse - ziemlich kompliziet!

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
15.03.2008, 22:34 Uhr
jeykey



Hallo, ehm ich programmier mit so nem Buch (C++ für Spieleprogrammierer) und da erklärt (versucht) der Autor die Verwendung und Programmierung von Singleton-Klassen. Leider ist das - meiner Meinung nach - ein wenig misslungen.

Mit Google hab ich schon gesucht, war aber immer zu dumm um des zu verstehen.
Ich hoffe ihr könnt mir helfen?

1.) Was bringen Singleton-Klassen überhaupt?

2.) In dem Buch gibt es folgende Zeilen in der Singleton-Klasse, Zeilen die ich nicht versteh hab ich kommentiert:

Code:
#ifndef TSINGLETON
#define TSINGLETON

template <class T>
class TSingleton
{
    protected:
        static T *m_pSingleton; [b]// statisches Objekt[/b]
    
        public:
        virtual ~TSingleton () {};

inline static T* Get () { [b]// Nochmal statische Funktion, is das nicht doppelt gemoppelt?[/b]
    if (!m_pSingleton)
            m_pSingleton = new T; // Instanz erzeugen
            
    return m_pSingleton;
}


Eine andere Datei, die die Funktionalität der Singletonklasse nutzt:

Code:
#include <iostream>
#include "Singleton.hpp"

using namespace std;

class CLogfile : public TSingleton<CLogfile> [b]// Kann die Datei Logfile ein Datentyp sein????[/b]
{
    public:
    CLogfile () { cout << "Neues Logfile" << endl; }
    ~CLogfile () { cout << "Logfile geschlossen" << endl; }
    
        //Pseudo-Funktion
    void Statusmeldung () { cout << "Statusmeldung wird ins Logfile geschrieben" << endl; }
};



void Funktion () {
    CLogfile::Get()->Statusmeldung(); [b]// Was wird hier genau gemacht?[/b]
}

int main ()
{
    Funktion();
    
    CLogfile::Del ();
    return 0;
}


Ps: Ich hoffe ich verlang nicht zu viel von euch

Dieser Post wurde am 15.03.2008 um 22:35 Uhr von jeykey editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
16.03.2008, 00:43 Uhr
ao

(Operator)


Singleton ist ein Entwurfsmuster. Es wird benutzt, um sicherzustellen, dass von einem Objekt nur eine einzige Instanz erzeugt werden kann.

Hast du das hier schon gesehen? http://de.wikipedia.org/wiki/Singleton_(Entwurfsmuster)

Was ist daran unklar?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
16.03.2008, 10:04 Uhr
jeykey



Ja den Artikel hab ich schon gelesen, aber in meinem Buch steht das anders: Es handelt sich um eine Klasse, die eine Instanz einer beliebigen anderen Klasse erzeugt und diese dann speichert, damit sie weiterverwendet werden kann.
Aber wo wird denn hier was weiterverwendet? - irgendwie ist das ziemlich verwirrend
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
16.03.2008, 13:35 Uhr
ao

(Operator)



Zitat von jeykey:
Es handelt sich um eine Klasse, die eine Instanz einer beliebigen anderen Klasse erzeugt und diese dann speichert, damit sie weiterverwendet werden kann.

... die genau eine Instanz erzeugt, darauf kommt es an.

Bei einer Logfile-Klasse z.B. will man, dass es ein einziges File gibt, in dem alle Log-Ausgaben landen. Jede Klasse, die etwas loggen will, muss darum dasselbe Logfile benutzen. Darum ist das Logfile ein Singleton.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
16.03.2008, 17:17 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


oder man benutzt z.b statt 2-3 globalen variablen eine singleton-klasse die die entsprechenden variablen bereitstellen (natürlich über get/set) so hat man kontrolle über diese und sind trotzdem mehr oder weniger "global" erreichbar
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
16.03.2008, 21:01 Uhr
Pler
Einer von Vielen
(Operator)


Ist das vielleicht ein wenig mit einer Factory durcheinander gekommen? Eine Factory erzeugt Instanzen anderer Klassen.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
16.03.2008, 21:22 Uhr
0xdeadbeef
Gott
(Operator)


Die klassische C++-Singleton-Pattern ist

C++:
class singleton {
public:
  // Hier wichtiger Teil:
  static singleton &instance() {
    static singleton me;
    return me;
  }

private:
  singleton() { }
};


Wie dem auch sei, Singletons sind in aller Regel ziemlich unsinnig. Sie leiden unter (fast) allen Nachteilen, die globale Variablen so böse machen, und die Einzigartigkeitsbedingung ist in der Praxis äußerst selten von Nutzen und äußerst oft von Nachteil. Selbst bei Loggern, die viele Leute gern als Beispiel für Singletons anführen, kann sowas äußerst nervtötend werden, wenn du mal an mehrere Stellen gleichzeitig loggen willst, oder die Logging-Ausgaben verschiedene Subsysteme trennen willst, oder einen Haufen anderer Dinge, an die in der Designphase der Log-Klasse niemand denkt. Generell nimmt die Singleton-Pattern dem Code Flexibilität, und schränkt seine Wiederverwendbarkeit ein - und das ist eigentlich nichts, was man wirklich will. Sie mag in Einzelfällen sinnvoll sein, aber mir ist ganz ehrlich bisher kein solcher Fall über den Weg gelaufen.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
16.03.2008, 21:52 Uhr
jeykey




Zitat:
Wie dem auch sei, Singletons sind in aller Regel ziemlich unsinnig. Sie leiden unter (fast) allen Nachteilen, die globale Variablen so böse machen, und die Einzigartigkeitsbedingung ist in der Praxis äußerst selten von Nutzen und äußerst oft von Nachteil. Selbst bei Loggern, die viele Leute gern als Beispiel für Singletons anführen, kann sowas äußerst nervtötend werden, wenn du mal an mehrere Stellen gleichzeitig loggen willst, oder die Logging-Ausgaben verschiedene Subsysteme trennen willst, oder einen Haufen anderer Dinge, an die in der Designphase der Log-Klasse niemand denkt. Generell nimmt die Singleton-Pattern dem Code Flexibilität, und schränkt seine Wiederverwendbarkeit ein - und das ist eigentlich nichts, was man wirklich will. Sie mag in Einzelfällen sinnvoll sein, aber mir ist ganz ehrlich bisher kein solcher Fall über den Weg gelaufen.


Find ich gut! Heißt das ich kann DAS THEMA einfach überspringen?

Dieser Post wurde am 16.03.2008 um 21:52 Uhr von jeykey editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
16.03.2008, 23:34 Uhr
0xdeadbeef
Gott
(Operator)


Naja, gut zu kennen ist das schon, für den Fall, dass es dir mal in anderer Leute Code über den Weg läuft. Nur einsetzen solltest du es nur nach reichlicher Überlegung.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
17.03.2008, 10:59 Uhr
jeykey



Aber vielleicht nochmal eine Frage von ganz oben, wie kann man in dem Template die Datei namens Logfile als Typ übergeben, normalerweise müsste dort doch int un so stehn!?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: