Frage zu Singleton-Pattern



  • Hallo!

    Ich hab mich gerade wieder mal mit Design Patterns beschäftigt und in C++ ein Singleton implementiert, hier der Code aus "vehicle.cpp"

    #include "vehicle.h"
    #include <iostream>
    
    using std::endl;
    using std::cout;
    
    Vehicle::Vehicle()
    {
    }
    
    Vehicle* Vehicle::instance = 0; //<--???
    
    Vehicle* Vehicle::getInstance()
    {
        if(Vehicle::instance == 0)
        {
            instance = new Vehicle();
        }
    
        return instance;
    }
    
    

    Soweit funktioniert alles, kann mir nur jemand erklären, warum man die markierte Zeile braucht? Wen ich diese nicht dabei habe kompiliert er nicht und zeigt mir einen undefined reference Fehler an... ganz verstehe ich das jetzt nicht.

    Bitte um kurze Aufklärung 🙂

    Danke & LG



  • Das ist eine statische Variable, die zur Klasse und nicht zu einem Objekt der Klasse gehört.
    Der C++ Standard verlangt, dass statische Variablen halt so definiert werden. In deinem Fall gleichzeitig definiert und initialisiert.

    PS:
    Seit C++11 verwendet man nullptr statt NULLoder 0.



  • Zur Antwort: irgendwo muss für die Variable ja auch Speicher reserviert werden. Im Header hast du vmtl. nur eine Vorwärts-Deklaration dieser Variablen.

    Allgemein:

    • dein Singleton ist nicht threadsafe
    • allgemein ergibt ein Singleton für ein Vehicle keinen Sinn
    • Singletons sehr sparsam einsetzen, wenn überhaupt!
    • viel einfacher: nimm ein Meyers-Singleton:
      class Vehicle {
      public:
          static Vehicle& instance() {
             static Vehicle v;
             return v;
          }
      private:
         Vehicle() = default;  // Konstruktor ist privat!
         Vehicle(const Vehicle&) = delete;
      };
      

Anmelden zum Antworten