J'ai ce code existant où ils ont une classe et une méthode d'initialisation dans cette classe. Il est prévu qu'une fois l'objet de la classe créé, ils doivent appeler initialize dessus.
Raison pour laquelle la méthode initialize existe L'objet est créé tôt pour avoir une portée globale, puis la méthode initialize est appelée plus tard après le chargement d'une DLL dont elle dépend.
Problème avec l'initialisation La classe a maintenant ce bool isInitialized qui doit être vérifié dans chaque méthode avant de continuer et renvoie une erreur si elle n'est pas initialisée. Autrement dit, c'est une grande douleur.
Une solution possible Initialiser dans le constructeur. Ayez juste un pointeur sur l'objet dans la portée globale. Créez l'objet réel après le chargement de la DLL.
Problème avec la solution ci-dessus Quiconque crée un objet de cette classe doit savoir qu'il doit être créé uniquement après le chargement de la DLL, sinon il échouera.
Est-ce acceptable?
call_once
en C ++ 11 . Les projets qui ne sont pas encore en C ++ 11 devraient étudier comment call_once est implémenté en C ++ 11 (se concentrer sur le problème qu'il résout, puis comment), puis le réimplémenter dans leur version (périmée) de C ++. Il a besoin d'une primitive de synchronisation sécurisée multi-thread, dont l'état doit être initialisé statiquement (avec une valeur constante). Notez que les compilateurs pré-C ++ 11 peuvent avoir d'autres idiosyncrasies qui doivent être satisfaites.