У меня есть этот существующий код, где у них есть класс и метод инициализации в этом классе. Ожидается, что, как только объект класса будет создан, им нужно вызвать initialize для него.
Причина, по которой существует метод initialize . Объект создается раньше, чтобы иметь глобальную область видимости, а затем метод initialize вызывается позже после загрузки библиотеки DLL, от которой он зависит.
Проблема с инициализацией У класса теперь есть этот bool isInitialized, который нужно проверять в каждом методе, прежде чем он продолжит работу и возвращает ошибку, если он не инициализирован. Проще говоря, это большая боль.
Одно из возможных решений Инициализация в конструкторе. Есть только указатель на объект в глобальной области видимости. Создайте реальный объект после загрузки DLL.
Проблема с вышеупомянутым решением Любой, кто создает объект этого класса, должен знать, что его нужно создавать только после загрузки dll, иначе он потерпит неудачу.
Это приемлемо?
call_once
в C ++ 11 . Проекты, которые еще не находятся на C ++ 11, должны изучить, как call_once реализован в C ++ 11 (сосредоточиться на том, какую проблему он решает, а затем как), а затем повторно реализовать его в своем (устаревшем) варианте C ++. Он нуждается в многопоточном безопасном примитиве синхронизации, состояние которого необходимо статически инициализировать (с постоянным значением). Обратите внимание, что компиляторы до C ++ 11 могут иметь другие особенности, которые должны быть выполнены.