Tengo este código existente donde tienen una clase y un método de inicialización en esa clase. Se espera que una vez que se crea el objeto de la clase, necesiten llamar a initialize en él.
Motivo por el que existe el método de inicialización El objeto se crea temprano para tener un alcance global y luego se llama al método de inicialización más tarde después de cargar un archivo dll del que depende.
Problema con la inicialización La clase ahora tiene este bool isInitialized que debe verificarse en cada método antes de continuar y devuelve un error si no se inicializa. En pocas palabras, es un gran dolor.
Una posible solución Inicializar en el constructor. Tenga solo un puntero al objeto en el ámbito global. Cree el objeto real después de que se cargue el dll.
Problema con la solución anterior Cualquier persona que cree un objeto de esta clase debe saber que debe crearse solo después de cargar el archivo DLL o, de lo contrario, fallará.
¿Es esto aceptable?
call_once
en C ++ 11 . Los proyectos que aún no están en C ++ 11 deben estudiar cómo se implementa call_once en C ++ 11 (centrarse en qué problema resuelve y luego cómo), y luego volver a implementarlo en su sabor (obsoleto) de C ++. Necesita una primitiva de sincronización segura de subprocesos múltiples, cuyo estado debe inicializarse estáticamente (con un valor constante). Tenga en cuenta que los compiladores anteriores a C ++ 11 pueden tener otras idiosincrasias que deben satisfacerse.