Singleton-Template zur einfachen Verwendung gesucht



  • Ich habe versucht eine einfache Singleton-Basisklasse zu erstellen, die man verwenden kann um bestimme Klassen als Singleton zu erstellen.
    Allerdings lässt sich trotzdem eine normale Instanz erstellen. Wie kann ich das umgehen ohne dass ich in Foo den Ctor private deklarieren muss?

    #include <iostream>
    
    template<class T>
    class Singleton
    {
    public:
    	static T& Handle()
    	{
    		static T instance;
    		return instance;
    	}
    protected:
    	Singleton() {}
    private:
    	Singleton(const Singleton&);
    	Singleton& operator=(const Singleton&);
    };
    
    class Foo : public Singleton<Foo>
    {
    public:
    	void Bar() { std::cout << "Hallo Welt!" << std::endl; }
    };
    
    int main()
    {
    	Foo::Handle().Bar();
    	Foo foo; // Sollte einen Fehler bewirken!
    	foo.Bar();
    }
    


  • joomoo schrieb:

    Ich habe versucht eine einfache Singleton-Basisklasse zu erstellen, die man verwenden kann um bestimme Klassen als Singleton zu erstellen.
    Allerdings lässt sich trotzdem eine normale Instanz erstellen. Wie kann ich das umgehen ohne dass ich in Foo den Ctor private deklarieren muss?

    Ich würde sagen garnicht. Eine Singleton existiert ja nur einmal, und genau da liegt dein Problem von Foo lassen sich beliebig viele Instanzen erstellen. Da Foo selbst auch noch von Singleton erbt und der Konstruktor Protectet ist erstellt es sich jedesmal eine eigene Singleton. Wenn du so ein Konzept verfolgen willst mußt du in Foo Konstruktor,Copykonstruktor und Operator= genau wie in Singleton private machen. Die Konstruktion des Objekts von Foo würde ja für dich der Aufruf Foo::Handle() erledigen. Sofern du aber in Singleton keine speziellen Maßnahmen ergreifen willst würde ich Singleton ganz weglassen und das Konzept in Foo integrieren da alles bis auf die static Funktion in Foo ja auch vorhanden sein muß.



  • class Foo : public Singleton<Foo> 
    { 
    friend template <typename T> Singleton <T>;
    
    private:
        Foo() {}
    public: 
        void Bar() { std::cout << "Hallo Welt!" << std::endl; } 
    };
    

    bei der friend-syntax bin ich mir net sicher - muss ich selbst immer in allen möglichen reihenfolgen probieren, weil ichs so selten brauch 😉

    bb


Anmelden zum Antworten