Verknüpfung einer sich selbst registrierenden, abstrakten Fabrik

Ich habe mit einer selbstregistrierenden, abstrakten Fabrik gearbeitet und sie getestet, basierend auf der hier beschriebenen:

https://stackoverflow.com/a/582456

In all meinen Testfällen funktioniert es wie ein Zauber und bietet die Funktionen und die Wiederverwendung, die ich wollte.

Das Verlinken dieser Factory in meinem Projekt mit cmake war ziemlich schwierig (obwohl es eher ein Problem zu sein scheint).

Ich habe die identische base.hpp, derivativeb.hpp / cpp und eine äquivalente derivativea.hpp / cpp zum Beispiel verlinkt. In der Regel instanziiere ich einfach die Factory und rufe createInstance () zweimal auf, jeweils einmal mit "DerivedA" und "DerivedB".

Die von der Zeile erstellte ausführbare Datei:

<code>g++ -o testFactory main.cpp derivedb.o deriveda.o
</code>

funktioniert wie erwartet. Das Verschieben meiner abgeleiteten Klassen in eine Bibliothek (mithilfe von cmake, aber ich habe dies auch mit ar allein getestet) und das anschließende Verknüpfen schlägt fehl:

<code>ar cr libbase.a deriveda.o derivedb.o
g++ -o testFactory libbase.a main.cpp
</code>

ruft nur die erste statische Instanziierung (von derivativeA.cpp) und niemals die zweite statische Instanziierung auf, d.h.

<code>// 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");
</code>

Beachten Sie, dass das Vertauschen der beiden in der Zeile ar nur die statische Instanziierung derivativeb.cpp und nicht die Instanziierung derivativea.cpp aufruft.

Vermisse ich etwas mit ar oder statischen Bibliotheken, die mit statischen Variablen in C ++ irgendwie nicht gut funktionieren?

Antworten auf die Frage(1)

Ihre Antwort auf die Frage