Frage zum Singleton Pattern



  • Moin.

    Ich habe eine Frage zum Singleton Pattern wie es bei Wikipedia beschrieben steht:

    class Singleton
       {
       private:
          static Singleton* instance;
          Singleton() {}
          Singleton(const Singleton&) {}
          ~Singleton() {}
       public:
          static Singleton& getInstance();
          static void destroy();
       };
    
       Singleton* Singleton::instance = 0;
    
       Singleton& Singleton::getInstance()
       {
          if ( !instance )
             instance = new Singleton();
          return *instance;
       }
    
       void Singleton::destroy()
       {
          if ( instance )
             delete instance;
          instance = 0;
       }
    

    Wieso ist der Typ des Rückgabewerts von getInstance Singleton& und 'instance' dereferenziert?

    Ich hätte jetzt den Zeiger auf das Objekt zurückgeliefert, also Typ des Rückgabewert Singleton*.

    Damit könnte man dann doch wunderbar arbeiten, oder nicht? Wieso wird das so gemacht wie es bei Wikipedia steht?

    Vielen Dank



  • Warum sollte man?



  • 314159265358979 schrieb:

    Warum sollte man?

    👍
    Was willst du denn mit einem Zeiger? Ihn auf ein anderes Objekt zeigen lassen? Ne, warte mal..



  • Vielen Dank für ne Antwort ohne Untertöne 🙄

    @cooky451
    Okay ich warte...



  • Ich glaube, du hast cooky nicht richtig verstanden.

    Zeiger kann man nachträglich auf andere Objekte des gleichen Typs umlenken.

    also

    Foo a, b;
    Foo * p = &a; // Initialisierung
    p = &b; // Hier wird "umgelenkt"
    

    Das ergibt aber bei einem Singleton keinen Sinn,
    da es ja nur das eine Singleton gibt.
    Deshalb das "Ne, warte mal..." 😉

    Jetzt ist aber intern eine Referenz nichts anderes als ein Zeiger.
    Mit 3 Unterschieden:
    1. Man kann Referenzen nachträglich nicht mehr umlenken (ist ja auch nicht nötig)
    2. Keine Zeigerarithmetik
    3. Die Syntax ist angenehmer (Geschmackssache)

    Foo & foo = Foo::instance();
    foo.bar();
    
    // vs.
    
    Foo * foo = Foo::instance();
    foo->bar();
    


  • ViktorII schrieb:

    Damit könnte man dann doch wunderbar arbeiten, oder nicht?

    Ja

    ViktorII schrieb:

    Wieso wird das so gemacht wie es bei Wikipedia steht?

    Weil es damit noch bequemer wird.

    Abgesehen davon solltest du Singleton besser nicht verwenden. Grund: Siehe ein beliebiger der tausenden Threads zum Thema hier im Forum 😉



  • @DrakoXP: Ja klar, Du hast recht. Jetzt habe ich es verstanden. Hatte den & Operator für Referenzen nicht mehr auf dem Schirm. Dachte erste das dort eine Kopie erstellt wird, was ja natürlich keinen Sinn macht 🙂

    Vielen Dank für Deine ausführliche Erklärung 👍 und auch Dank an dot


Anmelden zum Antworten