「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > クラス名文字列から C++ オブジェクトを動的にインスタンス化するにはどうすればよいですか?

クラス名文字列から C++ オブジェクトを動的にインスタンス化するにはどうすればよいですか?

2024 年 12 月 25 日に公開
ブラウズ:773

How Can I Instantiate C   Objects Dynamically from Class Name Strings?

クラス名文字列からの柔軟なオブジェクトのインスタンス化

はじめに

オブジェクト指向プログラミングでは、インスタンスを作成するのが一般的です。特定のクラスのオブジェクト。ただし、特定のシナリオでは、文字列として保存されたクラス名に基づいてオブジェクトを動的に作成する方が有利な場合があります。これにより、柔軟性とコードの保守性が向上します。この記事では、C でこの動的なオブジェクトの作成を実現する可能性について検討します。

文字列から型への変換を使用した動的なオブジェクトのインスタンス化

残念ながら、C ではネイティブにクラス名を保持する文字列を実際の型情報に変換するための直接メカニズム。これは、明示的にコードを変更しない限り、静的に定義されたクラスを動的にインスタンス化できないことを意味します。

代替アプローチ

文字列から型への直接変換は使用できませんが、次のような方法があります。動的オブジェクト作成を実現するための代替手法:

1.マッピング構造の使用:

クラス名 (文字列として) と、それらのクラスのインスタンスを作成する関数ポインターの間のマッピングを作成できます。これにより、関数ポインターを検索して呼び出すことで、動的なオブジェクトを作成できます。

template  Base* createInstance() { return new T; }

std::map<:string base> map;
map["DerivedA"] = &createInstance;  // ... and so on

2.自動クラス登録:

この方法では、マクロまたはテンプレートを使用してコンパイル中にクラスを登録します。登録されたクラスは自動的にグローバル マップに追加され、その名前を使用して登録されたクラスからオブジェクトを作成できるようになります。

#define REGISTER_DEC_TYPE(NAME) \
    static DerivedRegister reg

#define REGISTER_DEF_TYPE(NAME) \
    DerivedRegister NAME::reg(#NAME)

class DerivedB {
    ...;
    REGISTER_DEF_TYPE(DerivedB);
};

3. Boost Variant の使用:

無関係な型のオブジェクトを作成する必要があるシナリオのために、Boost ライブラリは、variant 型を提供します。この型はさまざまな型の値を保持でき、保存された型情報に基づいて動的にアクセスできます。 テンプレート バリアントタイプ createInstance() { リターン バリアントタイプ(T()); }

typedef boost::variant variant_type;
template  variant_type createInstance() { return variant_type(T()); }
結論

C には文字列から型への直接変換がありませんが、この記事で説明する代替アプローチは、文字列からオブジェクトを動的にインスタンス化する手段を提供します。マッピング構造、自動クラス登録、または Boost バリアント型を利用することで、開発者はオブジェクト指向アプリケーションでより優れた柔軟性とコードの保守性を実現できます。

最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3