ich eine Klasse mit der folgenden statischen Methode geschrieben haben:C++ Funktion mit Nebeneffekt bei Dateigültigkeitsbereich verwendet, greift Singleton
MyMap& Manager::GetMap(void)
{
static MyMap* factories = new MyMap();
return (*factories);
}
Wo „MyMap“ ist ein typedef für:
unordered_map<string, function<Base* (Dependency& d)>>
Es gibt auch eine Vielzahl von Typen, die von Base abgeleitet sind, z
class Derived1 : public Base
{
public:
Derived1(Dependency& d);
};
Betrachten Sie die folgende Verwendung.
definiere ich die folgenden in einer Implementierungsdatei für Derived1:
#include "Derived1.h"
#include "Manager.h"
int RegisterDerived1(void)
{
Manager::GetMap()["Test"] = [](Dependency& d){ return new Derived1(d); };
return 0;
}
int Reg = RegisterDerived1();
Sie können keine Funktionen im Dateigültigkeitsbereich aufrufen, aber Sie können den Rückgabewert einer Funktion zu einer globalen Variablen zugewiesen werden, auch wenn diese Funktion hat Nebenwirkungen. Zu dem Zeitpunkt, an dem "Manager" verwendet wird, wird daher "MyMap" String/Funktionspaare für verschiedene abgeleitete Arten von "Base" (bis jetzt) enthalten. Die Absicht ist, dass neue abgeleitete Typen von "Base" sich mit "Manager" registrieren, in der Lage, Instanzen dieses Typs zu konstruieren und basierend auf einem Namen den Typ auszuwählen.
Ich frage mich, ob dies ein sicheres Verhalten darstellt und/oder ob es alternative Implementierungen gibt, um den gewünschten Effekt zu erzielen?
Ich wurde auf diesen Artikel aufmerksam gemacht, der ein generisches Registrierungsobjekt vorschlägt, das das obige Paar in seinem Konstruktor übernimmt und die Registrierung durchführt, von der dann eine statische Instanz für jede zu registrierende Klasse definiert wird.
http://accu.org/index.php/journals/597
Es scheint, dass Sie im Grunde „Verzögerte Initialisierung“ fragen und die anderen Code bezogene Dinge sind nicht viel relevant. Haben Sie das Gefühl, beantwortet dieser Beitrag Ihr Q: [Lazy Initialisierung mit Singleton-Muster] (http://stackoverflow.com/q/21252296/514235). Wenn ja, kann es als Duplikat geschlossen werden. – iammilind
@iammilind Ich bin klar auf das Verhalten der Singleton-Implementierung, das ist, was ich denke, dass diese Frage ist. Ich habe nur die anderen Bits für den Kontext eingefügt. Was mir weniger klar ist, sind die Auswirkungen der Verwendung der obigen freien Funktion im Dateibereich. Es fühlt sich an wie eine schlechte Sache, da ich eine Einschränkung umgehen muss. –