ho lavorato con e testare un auto-registrazione, Abstract Factory basa su quello descritto qui:collegando un auto-registrazione, fabbrica astratto
https://stackoverflow.com/a/582456
In tutti i miei casi di test, funziona come un fascino, e fornisce le caratteristiche e il riutilizzo che volevo.
Il collegamento in questa fabbrica nel mio progetto utilizzando cmake è stato piuttosto complicato (anche se sembra essere più un problema di ar).
Ho identico base.hpp, derivedb.hpp/cpp e un equivalente deriveda.hpp/cpp all'esempio collegato. In generale, ho semplicemente creato un'istanza della factory e chiamato createInstance() due volte, una volta ciascuna con "DerivedA" e "DerivedB".
L'eseguibile creato dalla linea:
g++ -o testFactory main.cpp derivedb.o deriveda.o
funziona come previsto. Spostare le mie classi derivate in una libreria (usando CMake, ma ho provato questo con ar solo come bene) e poi il collegamento fallisce:
ar cr libbase.a deriveda.o derivedb.o
g++ -o testFactory libbase.a main.cpp
chiama solo il primo di un'istanza statica (da derivedA.cpp) e mai il secondo istanziazione statico, ossia
// 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");
noti che scambiando i due nella linea ar solo chiamate l'istanza statica derivedb.cpp, e non l'istanziazione deriveda.cpp.
Mi manca qualcosa con ar o librerie statiche che in qualche modo non funzionano con le variabili statiche in C++?
Grazie mille, questo mi ha messo sulla strada giusta. Per riferimento futuro, questo ha aiutato anche (grazie a migliorata ricerca-foo su tutto l'archivio!) http://stackoverflow.com/a/842770/1322752 –