Singletons über statische Instanz in C ++ - in Quell- oder in Header-Dateien?

8

Prost,

Ich habe diesen Code in "Programming AI by Example" beschrieben:

%Vor%

Ich bin verwirrt durch die sachliche Aussage des Autors, dass die statisch deklarierte Variable innerhalb einer Funktion im Header dazu führt, dass mehrere separate statische Variablen instance deklariert werden. Ich glaube nicht, dass ich dieses Verhalten in meinen üblichen Implementierungen von getInstance() function gesehen habe, die ich regelmäßig in die Header setze (außer dass ich gerne mit Zeigern spiele und das Singleton beim ersten Gebrauch initialisiere). Ich verwende GCC für meine Arbeit.

Was sagt der Standard? Was sagen nicht konforme Compiler? Ist die Aussage des Autors korrekt, und wenn ja, können Sie einige Compiler benennen, die mehrere Instanzen erzeugen würden, wenn getInstance() in den Headern deklariert wären?

    
Ivan Vučica 07.09.2009, 13:01
quelle

2 Antworten

10

In C ++ verhindert nichts, dass eine Inline-Funktion eine statische Variable hat und der Compiler muss dafür sorgen, dass diese Variable allen Übersetzungseinheiten gemeinsam ist (so wie es bei statischen Klassenmitgliedern der Template-Instantiierung und statischen Funktionsvariablen der Fall ist). 7.1.2 / 4

  

Eine static Variable in einer extern inline Funktion bezieht sich immer auf das gleiche Objekt.

Beachten Sie, dass Inline-Funktionen in C keine statischen Variablen haben dürfen (und keinen Verweis auf ein Objekt mit interner Verknüpfung).

    
AProgrammer 07.09.2009, 13:17
quelle
1

Ich habe den Code, den das OP mit VS2008 gepostet hat, auf vier Arten ausprobiert und es scheint kein Problem mit der statischen Instanz von MyClass in MyClass::Instance() zu geben.

  1. Instance() ist in definiert MyClass.cpp: Dies ist der normale Weg alles ist in Ordnung.
  2. Instance() ist nur innerhalb der Klassendeklaration Dies ist das Alternative und alles ist in Ordnung.
  3. Instance() ist definiert inline außerhalb der Klasse, aber im Header und alles ist in Ordnung.
  4. als 3. aber ohne inline und der Linker sagt, es gibt mehrere Definitionen von %Code%

Ich denke, dass der Buchautor sich mit 4. oben beschäftigt und weiß, dass die statische Instanz von MyClass in einem Programm, das kompiliert und verlinkt, erledigt wird.

    
quamrana 07.09.2009 14:01
quelle