Почетный железнодорожник
Группа: Модератор
Сообщений: 874
|
есть фабрика класов типа синглтон т.е. существующая в единственном экземпляре.
есть множество объектов с общим интерфейсом (общим базовым классом) регистрирующиеся в фабрике классов на этапе инициализации статических переменных:CODE | const static reg=ClassFactory::GetInstance().Register(...); | каждый из классов находится в своём cpp файле.
соответственно при сборке происходит раздельная компиляция модулей (cpp файлов), редактор связей объединяет все объектники и устанавливает точку входа.
при запуске программы срабатывает функция инициализации статических переменных (её создаёт и встраивает компилятор) в каждом из модулей. и в результате в фаюрике классов зарегистрированы все объекты.
а теперь выношу эти объекты и фабрику классов в библиотеку.
линкую с главным файлом (тот, где функция main) и получаю облом — фабрика классов пустая.
методом тыка нашёл, что статическая инициализация у объектника взятого из библиотеки срабатывает только в том случае, если вызывается хоть одна не inline функция этого объектника.
а ведь задумка была так хороша — сваливаем все объекты и их фабрику в одну библиотеку, линкуем библиотеку с программами и эти программы автоматим (через ФК) получают возможность работать с объектами. добавляем новый объект в ФК, а все остальные программы надо только перекомпилировать.
как быть? отказаться от статической инициализации? превратить ФК в громадный switch? сделать функцию инициализации библиотеки (которая все объекты будет регистрировать в ФК)?
PS. ФК содрал из "современного проектирования на С++" именно в ней предлагалось использовать старическую инициализацию, но нигде ни слова небыло о вынесении объектов и ФК и библиотеку. |