Откажитесь от Singleton и сделайте Value
глобальную переменную const
, инициализированную вспомогательной функцией.
Пример:
// anonymous namespace to bind the global to this file to prevent the static
// initialization order fiasco
namespace
{
const int Value = ReadIniFile("section", "key", default_value);
}
Но что если вам нужно использовать эту переменную в другихфайлы? Лучший совет, который я получил, - нет. Но если вам необходимо, фиаско статического порядка инициализации должно быть преодолено. Вот быстрый способ сделать это аналогично тому, что вы видели до сих пор:
// Lazy loader function similar to Meyers Singleton
int Value()
{
static int value = ReadIniFile("section", "key", default_value);
return value;
}
Использование:
me_function_need_Value(Value());
Это гарантирует, что Value
инициализируется прежде, чем кто-либо сможетстарайтесь использовать его независимо от того, какой файл нужен в вашем проекте. К сожалению, сейчас трудно понять, когда он выходит из области видимости, поэтому проблема на самом деле не исчезает. Он просто перемещен от начала программы к концу, где он немного более управляем. См. Порядок уничтожения статических объектов в C ++ . Убедитесь, что никто не использует Value
после выхода main
, и вы будете в безопасности. Тем не менее, используйте с осторожностью.