Singleton als Basisklasse



  • 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