2

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

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

4

7 に答える 7

3

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

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

于 2008-09-16T22:26:00.130 に答える
2

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

于 2008-09-16T22:16:55.923 に答える
1

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

于 2008-09-16T22:17:10.370 に答える
0

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

アンドレイ・アレキサンドレスクによるモダンC ++デザインと、この本に基づく彼のロキの実装を参照してください。ウィキペディアのLokiページも参照してください。

于 2008-09-16T22:16:15.160 に答える
0

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

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

于 2008-09-16T22:16:22.960 に答える
0

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

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

std :: string foo = "Derived1"; ベース*オブジェクト=新しい"foo"; //または好きな表記-C++では機能しません

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

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

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

于 2008-09-16T22:28:51.823 に答える
-1

すべてのクラスに独自のダイナミックライブラリがある場合は、ライブラリが存在するかどうかを確認してください。

于 2008-09-16T22:15:01.327 に答える