Рассмотрим следующий пример: класс с именем ObjectFactory определен для управления созданием нескольких классов. Эти управляемые классы должны быть зарегистрированы на фабрике, чтобы мы могли создавать соответствующие экземпляры.
Поскольку управляемых классов существуют сотни, для упрощения процесса регистрации я представляю следующий класс:
p>
Код: Выделить всё
template
class ObjectRegistrar {
public:
ObjectRegistrar() {
ObjectFactory::Instance()->Register(CLASS_NAMES(T), []() { return std::make_unique(); });
}
};
В каждом управляемом классе, например A:
Код: Выделить всё
class A {
private:
inline static ObjectRegistrar _registrar{};
};
добавляется статическая переменная-член. В начале программы все статические переменные будут инициализированы, тем самым регистрируя класс A в ObjectFactory. Однако если некоторые управляемые классы не включены явно (несмотря на то, что они скомпилированы, как указано в выводе компилятора), статическая переменная не инициализируется. Я подозреваю, что он удален компоновщиком, поскольку статическая переменная никогда не используется.
Что я могу сделать, чтобы гарантировать, что все статические переменные инициализируются правильно, без явного включения всех управляемых классов? Включение всех управляемых классов в одно место делает код чрезмерно связанным.
Подробнее здесь:
https://stackoverflow.com/questions/786 ... cluding-th