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?
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 einerextern 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).
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.
Instance()
ist in definiert
MyClass.cpp: Dies ist der normale Weg
alles ist in Ordnung. Instance()
ist nur innerhalb der
Klassendeklaration Dies ist das
Alternative und alles ist in Ordnung. Instance()
ist definiert inline
außerhalb der Klasse, aber im Header
und alles ist in Ordnung. 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.
Tags und Links c++ singleton compiler-construction