静的オブジェクトを正常に初期化しようとしています。目的は、ファクトリクラスをリポジトリ(シングルトン)に自動的に登録することです。私はすでに見ていただ静的オブジェクトの初期化を強制しようとしました
:How to force a static member to be initialized?
コメントの一つは、(私が続いてきたことを例もある)と述べている:
私はCでそれを読ん++標準(14.7.1):クラステンプレートのメンバまたはメンバテンプレートが明示的にインスタンス化されていないか、または明示的に特殊化されていない限り、メンバ定義が存在する必要があるコンテキストで特殊化が参照されると、メンバの特殊化は暗黙的にインスタンス化されます。静的データメンバの定義が必要な方法で静的データメンバ自体が使用されていない限り、静的データメンバの初期化(および関連する副作用)は発生しません。
私は同様のことをしようとしていますが、オブジェクトの初期化を強制することはできません。ここにコードがあります。私は何が欠けているのか分からない。これは私が使用しているテンプレートです。
namespace my_lib
{
template <typename T>
struct FactoryHelper
{
FactoryHelper();
static FactoryHelper<T> _helper;
};
}
、これはライブラリのユーザは、ファクトリクラスを定義し、同時に、リポジトリ内のオブジェクトを登録するために使用することがマクロである:
#define CREATE_FACTORY(ClassName)\
namespace my_lib\
{\
class ClassName##Factory;\
template<> FactoryHelper<ClassName##Factory>::FactoryHelper() { std::cout << "object initialized!" << std::endl; }\
template<> FactoryHelper<ClassName##Factory> FactoryHelper<ClassName##Factory>::_helper;\
struct ClassName##Factory : public FactoryBase<ClassName> {\
...\
};\
}
以前コードされますヘッダーファイル(Factory.h)で定義されています。 .cppファイル(Example.cpp)で
、私が持っている:私はプログラムを実行すると、それが呼び出されたときに
CREATE_FACTORY(UnitTestExample)
...
、私はそのコンストラクタプリントメッセージを見ることができません。どんな援助も大歓迎です。
ありがとうございます。
まず、提案と説明の両方に感謝します。私はあなたが私に与えたソリューションをコードに加えて動作させませんでした。その後、私は独立型のプログラムをやろうとしていました。 違いは、実装しているクラスがコンパイルされ、実行可能ファイルに静的ライブラリとしてリンクされていることです。静的ライブラリを使わずにコードをまとめてコンパイルすると動作します。 なぜ静的オブジェクトの初期化に影響しますか? ありがとう! – user1192525
私はここで応答が見つかりました: http://stackoverflow.com/questions/1804606/static-initialization-and-destruction-of-a-static-librarys-globals-not-happenin – user1192525