質問

複数のクラスがあり、それらはすべて基本クラスから派生していますが、プラットフォームによっては派生クラスの一部がコンパイルされなくなります。基本クラスのオブジェクトを返すことができるクラスがありますが、派生クラスの名前はすべてハードコードされています。

できれば実行時に、どのクラスがコンパイルされているかを確認して、リンクを削除し、代わりに動的にロード可能なライブラリを提供できるようにする方法はありますか。

役に立ちましたか?

解決

C++ ランタイム クラスの登録をお探しですか?私はこれを見つけました リンク (バックアップ).

おそらくそれはあなたが望むことを達成するでしょう。動的にロードされるモジュールについて、そして同じ方法を使用してそれらを登録できるかどうかはわかりません。

他のヒント

実際に何を実現しようとしているのかわかりませんが、各派生クラスの実装ファイルにシングルトン コンストラクターを配置して、ファクトリへのポインターとともに名前をリストに追加することはできます。そうすれば、リストは常に最新であり、コンパイルされたすべてのクラスを作成できます。

一般に、実行時の型情報に依存することは、C++ では悪い考えです。あなたが説明したものは工場のパターンのようです。各プラットフォームに、そのプラットフォーム上に存在するクラスのみを認識する特別なファクトリ サブクラスを作成することを検討することをお勧めします。

これは、「コンパイル時ポリモーフィズム」またはテンプレート ポリシー パラメーターを使用する場所のように思えます。

Andrei Alexandrescu と彼の最新の C++ 設計を参照してください。 ロキ 本に基づいて実装します。も参照してください。 ロキ ウィキペディアのページ。

実行時にクラス情報を取得するには、コンパイラ固有の厄介なトリックがあります。信じてください、あなたは虫の入った缶を開けたくありません。

これを行う唯一の本格的な方法は、各派生クラスで条件付きコンパイルを使用することだと思われます。#ifdef ブロック内で、 新しい コンパイル中のクラス名を含む定数。その後、名前は依然としてハードコーディングされていますが、すべて中央の場所にあります。

派生クラスの名前は C++ でハードコーディングする必要があります。他に使用する方法はありません。したがって、どのクラスがコンパイルされているかを自動的に検出する方法がないだけでなく、その情報が存在したとしてもそれを使用する方法もありません。

実行時に名前に基づいてクラスを指定できる場合は、次のようになります。

std::string foo = "派生1";Base * object = new "foo";// または任意の表記法 - C++ では機能しません

その場合、「Derived1」がコンパイルされたかどうかを判断できる機能が役立つでしょう。次のようにクラスを直接指定する必要があるため、

Base * オブジェクト = 新しい Derived1;// C++ では動作します

すべてのチェックはコンパイル時に行われます。

すべてのクラスに独自の動的ライブラリがある場合は、そのライブラリが存在するかどうかを確認するだけです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top