私はすべてが基本クラスから派生する複数のクラスを持っていますが、派生クラスのいくつかはプラットフォームによってコンパイルされません。私は基本クラスのオブジェクトを返すことができるクラスを持っていますが、派生クラスのすべての名前はハードコードされています。クラスのC++ランタイム知識
コンパイルされたクラスを実行時に決定する方法はありますか。リンクを削除して代わりに動的にロード可能なライブラリを提供することができます。
私はすべてが基本クラスから派生する複数のクラスを持っていますが、派生クラスのいくつかはプラットフォームによってコンパイルされません。私は基本クラスのオブジェクトを返すことができるクラスを持っていますが、派生クラスのすべての名前はハードコードされています。クラスのC++ランタイム知識
コンパイルされたクラスを実行時に決定する方法はありますか。リンクを削除して代わりに動的にロード可能なライブラリを提供することができます。
C++ランタイムクラス登録をお探しですか?私はこのリンクを見つけました: http://meat.net/2006/03/cpp-runtime-class-registration/
それはおそらくあなたが望むものを達成するでしょう、私は動的に読み込まれたモジュールと、同じ方法でそれらを登録できるかどうかわかりません。
すべてのクラスに独自のダイナミックライブラリがある場合は、ライブラリが存在するかどうかを確認してください。
実行時にクラス情報を取得するための、コンパイラ固有の厄介なことがあります。私を信じて、あなたはその虫の缶を開けたくありません。
これを実行する唯一の真剣な方法は、派生クラスのそれぞれで条件付きコンパイルを使用することです。 #ifdefブロック内で、コンパイルされるクラス名を含むの新しい定数を定義します。名前はまだハードコーディングされていますが、すべて中央の場所にあります。
実際に何を達成しようとしているのか分かりませんが、ファクトリへのポインタとともにリストに名前を追加するシングルトンコンストラクタを各派生クラスの実装ファイルに置くことができます。リストは常に最新であり、コンパイルされたすべてのクラスを作成できます。
一般的に、実行時の型情報に頼っているのは、C++では悪い考えです。あなたが説明したことは、工場のパターンのようです。プラットフォームごとに特別なファクトリサブクラスを作成することを検討してください。このサブクラスは、そのプラットフォームに存在するクラスについてのみ認識します。
派生クラスの名前は、C++でハードコードする必要があります。それらを使用する他の方法はありません。したがって、コンパイルされたクラスを自動的に検出する方法がないだけでなく、存在していればその情報を使用する方法もありません。
あなたは自分の名前に基づいて実行時にクラスを指定することができれば、のようなもの:
のstd ::文字列fooという=「Derived1」。 Base *オブジェクト=新しい "foo"; //好きな表記はC++では動作しません
"Derived1"がコンパイルされているかどうかを知ることができます。クラスを直接指定する必要があるため、
Base * object = new Derived1; // C++で動作します
コンパイル時にすべてチェックされます。
サイトがダウンしているようですが、http://web.archive.org/web/20100618122920/http://meat.net/2006/03/cpp-runtime-class-registrationでそのページが見つかりました。/ –
翻訳単位のクラスは、その翻訳単位内のコードが実行される前に構築されていなければならないため、標準で動作することは保証されているとは思いません。したがって、そのファイル内のコードを決して直接呼び出すことができなければ、構築する必要はありません。あるいは登録が遅すぎるかもしれません。したがって、別のコンパイラでは動作しない可能性があります。 これは類似した手法の遠隔記憶に基づいているため、完全に正確ではない可能性があります。 –