Ich habe eine Factory, welche sehr gut funktioniert insofern sich nicht klassen registrieren, welche in unterverzeichnissen des projektes liegen und als statische lib x.a beim linken hinzugefuegt werden.
Die Factory arbeitet im prinzip wie folgt:
Es gibt ein Makro
Code: Alles auswählen
#define REGISTER_ELEMENT(Class, Tag) \
Registrar<Class> Class##Registrar(Tag);
Code: Alles auswählen
template <class T>
class Registrar
{
public:
Registrar( const std::string &tag )
{
FactoryElement::Factory::self().announce( &factoryFn, tag );
}
static FactoryElement *factoryFn()
{
return new T;
}
};
Das klappt niemals, wenn diese variablen in .a libs liegen - wieso ?
D.h.
Registrar<Rectangle> bar in test.o
fuehrt zum aufrufen des konstruktors Foo sobald ich das programm starte, da bar eine globale variable ist.
Liegt dieselbe Variable in einer .a -lib passiert das nicht - erst wenn ich irgendwo einmal eine Variable der Klasse Rectangle erstelle - ala.
Rectangle rect;
Wieso ist das so ?
Was will ich erreichen ? Ich moechte statische libs dazulinken oder nicht, je nach bedarf - d.h. ich moechte den kunden nicht mit allen funktionien ausstatten.
Dazu bedarf es einer faktory, welche klassen dynamisch erstellen kann.
Gruss,
Arvid.
p.s. ich sehe im uebrigen, betrachte ich die .a libs und die .o, dass diese variablen durchaus vorhanden sind. Nur werden die konstruktoren der variablen in den .a's nicht zum programmstart aufgerufen obwohl sie global sind.