He estado trabajando con y probar un auto-registro, la fábrica abstracta basa en el descrito aquí:la vinculación de un auto-registro, la fábrica abstracta
https://stackoverflow.com/a/582456
En todos los casos de prueba, funciona como un amuleto, y proporciona las características y la reutilización que quería.
Enlazar en esta fábrica en mi proyecto utilizando cmake ha sido bastante complicado (aunque parece ser más un problema ar).
Tengo el base.hpp idéntico, derivedb.hpp/cpp, y un deriveda.hpp/cpp equivalente al ejemplo vinculado. En general, simplemente instanciamos la fábrica y llamamos a createInstance() dos veces, una vez cada una con "DerivedA" y "DerivedB".
El ejecutable creado por la línea:
g++ -o testFactory main.cpp derivedb.o deriveda.o
funciona como se espera. Moviendo mis clases derivadas en una biblioteca (con cmake, pero he probado esto con AR, individual) y después se une falla:
ar cr libbase.a deriveda.o derivedb.o
g++ -o testFactory libbase.a main.cpp
sólo llama la primera instanciación estática (de derivedA.cpp) y nunca la segunda instanciación estática, es decir,
// deriveda.cpp (if listed first in the "ar" line, this gets called)
DerivedRegister<DerivedA> DerivedA::reg("DerivedA");
// derivedb.cpp (if listed second in the "ar" line, this does not get called)
DerivedRegister<DerivedB> DerivedB::reg("DerivedB");
Tenga en cuenta que el canje de los dos en la línea ar Sólo llamadas de la creación de instancias estática derivedb.cpp, y no la creación de instancias deriveda.cpp.
¿Me falta algo con ar o bibliotecas estáticas que de alguna manera no funcionan bien con variables estáticas en C++?
Muchas gracias, esto me puso en el camino correcto. Para referencia futura, esto ayudó también (¡gracias a la búsqueda mejorada en todo el archivo!) http://stackoverflow.com/a/842770/1322752 –