Я работал и тестировал само -регистрирующую абстрактную фабрику, основанную на описанной здесь:
https://stackoverflow.com/a/582456
Во всех моих тестовых случаях, он работает как шарм и предоставляет функции и повторное использование, которые я хотел.
Связывание этой фабрики в моем проекте с использованием cmake было довольно сложным (, хотя, похоже, это скорее проблема с ar ).
У меня есть файлы base.hpp, производныеb.hpp/cpp и эквивалентные производные.hpp/cpp для приведенного примера. В основном я просто создаю экземпляр фабрики и дважды вызываю createInstance (), по одному разу с «DerivedA» и «DerivedB».
Исполняемый файл, созданный строкой :
g++ -o testFactory main.cpp derivedb.o deriveda.o
, работает должным образом. Перемещение моих производных классов в библиотеку (с помощью cmake, но я проверил это и с одним ar ), а затем связывание не удалось:
ar cr libbase.a deriveda.o derivedb.o
g++ -o testFactory libbase.a main.cpp
вызывает только первый статический экземпляр (из производногоA.cpp )и никогда не второй статический экземпляр, т.е.
// deriveda.cpp (if listed first in the "ar" line, this gets called)
DerivedRegister DerivedA::reg("DerivedA");
// derivedb.cpp (if listed second in the "ar" line, this does not get called)
DerivedRegister DerivedB::reg("DerivedB");
Обратите внимание, что замена двух строк в строке ar вызывает только статическую реализацию производногоb.cpp, а не реализацию производного.cpp.
Я что-то упустил с ar или статическими библиотеками, которые каким-то образом плохо работают со статическими переменными в C++?