Eu tenho esse código existente onde eles têm uma classe e um método de inicialização nessa classe. Espera-se que, uma vez que o objeto da classe seja criado, eles precisem chamar a inicialização.
Razão pela qual o método de inicialização existe O objeto é criado cedo para ter um escopo global e, em seguida, o método de inicialização é chamado posteriormente após o carregamento de uma dll da qual depende.
Problema ao inicializar A classe agora possui esse bool isInitialized, que precisa ser verificado em todos os métodos antes de prosseguir e retornar erro se não for inicializado. Simplificando, é uma grande dor.
Uma solução possível Inicialize no construtor. Tenha apenas um ponteiro para o objeto no escopo global. Crie o objeto real após o carregamento da DLL.
Problema com a solução acima Qualquer pessoa que crie um objeto dessa classe precisa saber que precisa ser criada somente após o carregamento da DLL, caso contrário, falhará.
Isso é aceitável?
call_once
C ++ 11 . Projetos que ainda não estão no C ++ 11 devem estudar como o call_once é implementado no C ++ 11 (foco no problema que ele resolve e depois como) e, em seguida, reimplementá-lo no seu sabor (obsoleto) de C ++. Ele precisa de uma primitiva de sincronização segura multithread, cujo estado precisa ser inicializado estaticamente (com um valor constante). Observe que os compiladores anteriores ao C ++ 11 podem ter outras idiossincrasias que precisam ser satisfeitas.