Singletons sauber in C++ programmieren

Manchmal braucht man nur eine Instanz einer Klasse und möchte darüber hinaus sicherstellen, dass es keine weiteren davon gibt. Das erreicht man mit Singletons.

Artikel verschenken
In Pocket speichern vorlesen Druckansicht 1 Kommentar lesen
Singletons sauber in C++ programmieren

(Bild: Albert Hulm)

Lesezeit: 7 Min.
Von
  • Oliver Lau
Inhaltsverzeichnis
Pina programmiert

Kürzlich hatte ich das Problem, dass ich in einem C++-Projekt gewährleisten wollte, nur ein einziges Objekt einer Klasse zu haben. Dass so was mit Singletons geht, wusste ich noch, aber wie genau, das hatte ich vergessen. Wenn man auf Stack Overflow und Konsorten nach Singleton sucht, findet man haufenweise Lösungen, aber irgendwie fehlte es jeder an Vollständigkeit.

tl;dr – Singletons kurz erklärt

Mit dem Entwurfsmuster "Singleton" erreicht man, dass sich von einer Klasse nicht mehr als ein Objekt erzeugen lässt. In C++ wird dazu der Konstruktor als private deklariert; eine statistische Methode liefert eine statische Instanz des Singleton zurück. Zur Sicherheit sollte man Copy-Konstruktor und Zuweisungsoperator als gelöscht markieren.

Beherbergt das Singleton nur wenige initialisierte Daten und ist der Aufruf des Konstruktors nicht teuer, bietet sich die übersichtlichere Eager-Variante an, sonst die Lazy-Variante. Die Lazy-Variante hat allerdings den winzigen Nachteil, dass jeder Aufruf der Fabrikmethode einen nullptr-Vergleich nach sich zieht. Bei der Eager-Variante ist er nicht erforderlich.

Also selber ran ans Werk und mal ausbaldowert, welche Möglichkeiten es gibt, einen Logger als Singleton zu implementieren. Der Logger war nämlich die Klasse, von der es nur eine Instanz geben sollte. Nun hätte ich diese Instanz einfach in einer globalen Variable hinterlegen können, aber das hätte noch nicht verhindert, dass andere Programmkomponenten eigene davon erzeugen. Würden sie das tun, könnte es zu Concurrency-Problemen beim Schreiben in die Log-Datei kommen. Wie schlimm sich diese auswirken, hängt von der zugrunde liegenden I/O-Schicht ab. Außerdem sind globale Variablen pfui.

Singletons hingegen garantieren, dass nur ein Objekt einer Klasse existiert – und im Unterschied zu globalen Variablen verlässt man damit nicht die saubere Welt der objektorientierte Programmierung (OOP), sondern schnuppert den Duft der weiten Welt der Entwurfsmuster. In C++ gibt es zwei Varianten von Singletons: Bei der einen liegt das Singleton im Datensegment des Programms, bei der anderen auf dem Heap. Den Quellcode des Beispielprogramms finden Sie in meinem GitHub-Repository. Die erste Variante ist die übersichtlichere: