Ich habe diesen vorhandenen Code, in dem sie eine Klasse und eine Initialisierungsmethode in dieser Klasse haben. Es wird erwartet, dass das Objekt der Klasse nach seiner Erstellung initialize aufgerufen werden muss.
Grund für die Existenz der Initialisierungsmethode Das Objekt wird frühzeitig mit einem globalen Gültigkeitsbereich erstellt und die Initialisierungsmethode wird später aufgerufen, nachdem eine DLL geladen wurde, von der es abhängt.
Problem mit der Initialisierung Die Klasse hat jetzt den Bool isInitialized, der in jeder Methode überprüft werden muss, bevor er fortfährt, und einen Fehler zurückgibt, wenn er nicht initialisiert ist. Einfach ausgedrückt, es ist ein großer Schmerz.
Eine mögliche Lösung Initialisieren Sie im Konstruktor. Haben Sie nur einen Zeiger auf das Objekt im globalen Bereich. Erstellen Sie das eigentliche Objekt, nachdem die DLL geladen wurde.
Problem mit der obigen Lösung Jeder, der ein Objekt dieser Klasse erstellt, muss wissen, dass es erst erstellt werden muss, nachdem die DLL geladen wurde, da es sonst fehlschlägt.
Ist das akzeptabel?
call_once
C ++ 11 . Projekte, die sich noch nicht in C ++ 11 befinden, sollten untersuchen, wie call_once in C ++ 11 implementiert wird (konzentrieren Sie sich darauf, welches Problem es löst, und dann wie), und es dann in ihrer (veralteten) Version von C ++ erneut implementieren. Es benötigt ein Multithread-sicheres Synchronisationsprimitiv, dessen Status statisch initialisiert werden muss (mit einem konstanten Wert). Beachten Sie, dass Compiler vor C ++ 11 möglicherweise andere Besonderheiten aufweisen, die erfüllt werden müssen.