はじめに
オブジェクト指向プログラミングでは、インスタンスを作成するのが一般的です。特定のクラスのオブジェクト。ただし、特定のシナリオでは、文字列として保存されたクラス名に基づいてオブジェクトを動的に作成する方が有利な場合があります。これにより、柔軟性とコードの保守性が向上します。この記事では、C でこの動的なオブジェクトの作成を実現する可能性について検討します。
文字列から型への変換を使用した動的なオブジェクトのインスタンス化
残念ながら、C ではネイティブにクラス名を保持する文字列を実際の型情報に変換するための直接メカニズム。これは、明示的にコードを変更しない限り、静的に定義されたクラスを動的にインスタンス化できないことを意味します。
代替アプローチ
文字列から型への直接変換は使用できませんが、次のような方法があります。動的なオブジェクト作成を実現するための代替手法:
1.マッピング構造の使用:
クラス名 (文字列として) と、それらのクラスのインスタンスを作成する関数ポインターの間のマッピングを作成できます。これにより、関数ポインターを検索して呼び出すことで、動的なオブジェクトを作成できます。
template <typename T> Base* createInstance() { return new T; } std::map<std::string, Base*(*)()> map; map["DerivedA"] = &createInstance<DerivedA>; // ... and so on
2.自動クラス登録:
この方法では、マクロまたはテンプレートを使用してコンパイル中にクラスを登録します。登録されたクラスは自動的にグローバル マップに追加され、その名前を使用して登録されたクラスからオブジェクトを作成できるようになります。
#define REGISTER_DEC_TYPE(NAME) \ static DerivedRegister<NAME> reg #define REGISTER_DEF_TYPE(NAME) \ DerivedRegister<NAME> NAME::reg(#NAME) class DerivedB { ...; REGISTER_DEF_TYPE(DerivedB); };
3. Boost バリアントの使用:
無関係なタイプのオブジェクトを作成する必要があるシナリオのために、Boost ライブラリはバリアント
typedef boost::variant<Foo, Bar, Baz> variant_type; template <typename T> variant_type createInstance() { return variant_type(T()); }
結論
一方、C には直接の string-to がありません。 -type 変換に加えて、この記事で説明する代替アプローチは、文字列からオブジェクトを動的にインスタンス化する手段を提供します。マッピング構造、自動クラス登録、または Boost バリアント型を利用することで、開発者はオブジェクト指向アプリケーションで柔軟性とコードの保守性を向上できます。
以上がクラス名の文字列から C オブジェクトを動的にインスタンス化するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。