私はと協力し、ここで説明する1つに基づいて、自己登録、抽象的な工場をテストしてきた:すべての私のテストケースで、抽象工場
https://stackoverflow.com/a/582456
、それは動作します魅力のように、私が望む機能と再利用を提供します。
私のプロジェクトでこの工場でリンクしているのは、cmakeを使っているのですが(それはarの問題のほうが多いようですが)。
リンクされた例には、同じbase.hpp、derivedb.hpp/cpp、および同等のderiveda.hpp/cppがあります。主に、私は単にファクトリをインスタンス化し、createInstance()を「DerivedA」と「DerivedB」でそれぞれ2回呼び出します。
ラインによって作成された実行ファイル:予想通り
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
は(derivedA.cppから)最初の静的インスタンス化とは決して秒を呼び出しますARラインに2を交換するderiveda.cppのインスタンスのみderivedb.cpp静的インスタンス化を呼び出し、いないことを静的インスタンス化、すなわち
// 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");
注意。
C++で静的変数を使用していても、何らかの理由でniceを再生できないarまたは静的ライブラリが欠けていますか?
ありがとう、これは私を正しい道のりにしました。将来の参考として、これも同様に役立ちました(全アーカイブの検索フーの改善に感謝します!) http://stackoverflow.com/a/842770/1322752 –