У мене є цей існуючий код, де у них є клас та метод ініціалізації в цьому класі. Очікується, що як тільки об’єкт класу буде створений, їм потрібно викликати ініціалізацію на ньому.
Причина, чому існує метод ініціалізації . Об'єкт створюється рано, щоб мати глобальну область застосування, а потім метод ініціалізації викликається пізніше після завантаження dll, від якого залежить.
Проблема з ініціалізацією Клас тепер має цей boIl ініціалізований, який потрібно перевірити в кожному методі, перш ніж він продовжується і повертає помилку, якщо вона не ініціалізована. Простіше кажучи, це великий біль.
Одне можливе рішення Ініціалізувати в конструкторі. Майте лише вказівник на об’єкт у глобальній області. Створіть фактичний об’єкт після завантаження dll.
Проблема з вищевказаним рішенням Кожен, хто створює об'єкт цього класу, повинен знати, що його потрібно створити лише після завантаження dll, інакше він вийде з ладу.
Це прийнятно?
call_onceв C ++ 11 . Проекти, яких ще немає на C ++ 11, повинні вивчити, як реалізується call_once в C ++ 11 (зосередитись на тому, яку проблему вона вирішує, а потім як), а потім повторно реалізувати її у своєму (усталеному) смаку C ++. Він потребує багатопотокового безпечного примітиву синхронізації, стан якого необхідно статично ініціалізувати (з постійним значенням). Зауважте, що компілятори pre-C ++ 11 можуть мати інші ідіосинкразії, які потрібно задовольнити.