Singleton als Basisklasse



  • Marc++us der fragt beim Aufruf der Seite nach einem User/PW für php/dba Access.



  • in den buch modern c++ desing gibt ein template was das können sollte, die lib (loki) zum buch gibt kostenlos online zum downloaden



  • Ich bin der Meinung, dass man sich vorher überlegen sollte, ob man vielleicht nicht doch etwas anderes als ein Singleton will: eine Instanz der Klasse, die überall diesselbe sein soll (sowas wie global)
    Dann reichte nämlich das:

    template <class T>
    class SingletonPattern : public T {
        static SingletonPattern<T> *single;
        SingletonPattern () {}
        SingletonPattern (const SingletonPattern &);
        const SingletonPattern &operator = (const SingletonPattern &);
    
    public:
        static T &getInstance () { return *single; }
    };
    template <class T> SingletonPattern<T> *SingletonPattern<T>::single = new SingletonPattern<T>;
    
    class Klasse {
        int x;
    
    public:
        int getX () const { return x; }
        void setX (int x_) { x = x_; }
    };
    
    int main () {
        {
            Klasse &s = SingletonPattern<Klasse>::getInstance();
            cout << s.getX () << endl;
            s.setX (10);
        }
    
        {
            Klasse &s = SingletonPattern<Klasse>::getInstance();
            cout << s.getX () << endl;
        }
        return 0;
    }
    

    Der Begriff SingletonPattern ist vielleicht irreführend, aber ich wollte die Namen nicht neu schreiben. Ein Singleton ist für mich ein Verbot für den Benutzer, mehrere Instanzen zu erstellen (...)
    Aber meistens/oft braucht man eben so etwas, wie oben beschrieben



  • Ja, das Problem daran sind nur die MemoryLeaks



  • Verdammt nochmal, ich brauche sowas auch gerade.
    Kennt nicht jemand ein gutes Online-Tutorial für so ein perfektes SingleTon, gut erklärt?



  • Ah, hab auch was Feines gefunden: http://www.informatik.fh-muenchen.de/schieder/seminar-oo-modellieren-ws97-98/f7alpha1.informatik.fh-muenchen.de/ifw94005/singleton.html#Absicht
    Ist zwar ein bißchen mieses C++, aber grundsätzlich wird da viel für ein gutes Singleton zusammengebracht. 🙂

    MfG MAV



  • Will man die Sachen wie Templateschablone, Threadsicherheit und definierte Abbaureihenfolgen alle erfüllt haben, wird aus diesem eigentlich primitivsten aller Design-Pattern eine richtige Monsterimplementation

    Und statt diese Monsterimplementation selbst zu basteln, greift man einfach zu Lokis (Andrei Alexandrescus Bibliothek zu "Modern C++ Design") SingletonHolder. Da kann man sich mit Policies alles fein zusammensetzen.



  • Ich bin ehrlichgesagt kein Fan von fremden Libs.
    Ich muss nicht unbedingt Templates verwenden, aber kann man es nicht irgendwie mit einem void* Pointer und nem' Static Cast machen?

    MfG MAV



  • Wozu überhaupt so eine Basisklasse?
    Ich meine das sind doch letztendlich nur drei Zeilen die aus einer Klasse so ein Singleton machen..

    Das Thread-Problem hab ich neulich gehabt (das war ein Spaß, bis ich irgendwann gemerkt hab wo die Problematik liegt ;)).



  • Original erstellt von Mis2com:
    Ich bin ehrlichgesagt kein Fan von fremden Libs.

    Warum das? 😕 Sowas erspart einem oft viel Arbeit!



  • Tja, weil ich mir das Zeugs am besten selber zusammencode.

    Kann mir nicht bitte jemand eine einfache SingleTon-basisklasse geben, die mit ganz gewöhnlichen Zeigern arbeitet.
    Wenn ich für alle die Klassen SingleTons brauche, dann ist es dach auch viel mehr OOP das so abzuleiten.
    Ich habe das Gefühl, dass meine Engine total schlecht aufgebaut ist, wenn sie die SingleTonklasse nicht extra ableitet. 😞

    MfG MAV

    [ Dieser Beitrag wurde am 15.04.2003 um 22:22 Uhr von Mis2com editiert. ]



  • Original erstellt von nman:
    Warum das? 😕 Sowas erspart einem oft viel Arbeit![/QB]

    Und schaft Abhängigkeiten. Bevor ich mir da irgendeine dicke Lib für solche ("unwichtigen") Aufgaben in's Projekt reinknalle, schreib ich lieber einmal am Anfang das Proramms ein get() rein.

    Als ich neulich auf das Thread-Problem gestoßen bin, wurde ich ohnehin skeptisch was so ein Singleton betrifft. Finde es irgendwie schöner, wenn man Kontrolle darüber hat, wann etwas initialisiert wird. Zumindest solange es sich nicht um ganz triviale Dinge handelt.



  • Hallo.

    Habe mal den Code zusammengebraut:

    class SingleTon
    {
    public:
        static SingleTon& Instance()
        {
            if(instance == 0)
                instance = new SingleTon;
    
            return *instance;
        }
        ~SingleTon()
        {
            delete instance;
        }
    protected:
        SingleTon() {}
    private:
        static SingleTon* instance;
    };
    
    SingleTon* SingleTon::instance;
    
    class Test : public SingleTon
    {
    public:
        void setA(int a) {m_a = a;}
        int  getA()      {return m_a;}
    private:
        int m_a;
    };
    
    ofstream ofs;
    
    void func1()
    {
        Test& t = (Test&)Test::Instance();
        ofs << t.getA();
        t.setA(120);
    }
    
    void func2()
    {
        Test& t = (Test&)Test::Instance();
        ofs << t.getA();
        t.setA(130);
    }
    
    int main()
    {
        ofs.open("D:\\daten.txt");
    
        ofs << "Start...\n";
    
        Test& t = (Test&)Test::Instance();
        t.setA(100);
    
        ofs << t.getA() << '\n';
    
        func1();
    
        ofs << t.getA();
    
        func2();
    
        ofs << t.getA();
    
        ofs << "Ende...\n";
    
        ofs.close();    
    
        return 0;
    }
    

    Funktioniert bestens!
    Ich habe ein Testprogramm drangekuppelt, dass auch überprüft ob das nicht immer die gleichen Instanzen sind...
    Nun, also was ist dagegen einzuwenden? 🙂

    MfG MAV

    [ Dieser Beitrag wurde am 15.04.2003 um 22:28 Uhr von Mis2com editiert. ]



  • btw singleton ist ein einziges Wort, die Schreibweise «SingleTon» ergibt also keinen Sinn.



  • Doch, sieht schöner aus.
    na egal, also was gibt es gegen meine Singleton-Klasse einzuwenden?
    (bis auf den noch zu ändernden namen)



  • Original erstellt von Mis2com:
    Doch, sieht schöner aus.
    na egal, also was gibt es gegen meine Singleton-Klasse einzuwenden?
    (bis auf den noch zu ändernden namen)

    Ja, das ganze ist Mist, weil du bei jedem Aufruf von Instance() erstmal zu der abgeleiteten Klasse casten musst. Ausserdem glaub ich, wurde hier schon eine Lösung mit Templates gepostet...

    Abgesehen davon, hab ich schon meine Meinung darüber geschrieben.. Ist das echt üblich für sowas eine Basis-Klasse zu schreiben? Da lohnt sich doch schon die #include-Zeile garnicht.



  • Das mit dem Casten find ich weniger schlimm.
    Und hier wurde keine perfekte Lösung gepostet, von daher...

    Nagut...
    Da mich die ganze Schei** mit den Singletons nerft, vererbe ich sie nicht mehr, und bau sie wieder normal ein, ist ja wirklich keinen Aufwand wert.

    mfG MAV

    [ Dieser Beitrag wurde am 15.04.2003 um 22:51 Uhr von Mis2com editiert. ]


Anmelden zum Antworten