Контроль порядка инициализации глобальной переменной
Требуется заставить глобальную переменную конкретного типа быть инициализированной после инициализации всех остальных глобальных переменных.
Например:
int& getCounter()
{
static int counter = 0;
return counter;
}
class Incrementer
{
public:
Incrementer()
{
getCounter()++;
}
};
class SomeOtherThingy
{
public:
SomeOtherThingy()
{
//делает что-то с результатом getCounter()
//мы ожидаем, что getCounter() должен вернуть 3
}
};
Incrementer i1{};
Incrementer i2{};
Incrementer i3{};
SomeOtherThingy thingy{};
В данном случае код работает - thingy
инициализируется после всех объектов типа Incrementer
. Однако, глобальные переменные типа Incrementer
могут находиться в разных юнитах трансляции. В таком случае сохранить порядок определения глобальных перменных очень сложно. Разумеется в таком случае thingy
не обязательно будет инициализирована последней.
Возможно ли как-то заставить глобальный объект типа SomeOtherThingy
гарантированно инициализироваться после остальных глобальных объектов (хотя бы после объектов типа Incrementer
)?
P.S. Реализация счётчика была представлена просто для примера. На деле там может быть что-то более сложное (структура данных, база данных, etc).
Ответы (1 шт):
Реализация подобного слишком сложна (и наверняка зависит от реализации, под которую пишем), поэтому лучше сделать инициализацию в начале main()
и не заморачиваться.