ホームページ > バックエンド開発 > C++ > クラス名の文字列から C オブジェクトを動的にインスタンス化するにはどうすればよいですか?

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

Susan Sarandon
リリース: 2024-12-19 20:40:10
オリジナル
368 人が閲覧しました

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

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

はじめに

オブジェクト指向プログラミングでは、インスタンスを作成するのが一般的です。特定のクラスのオブジェクト。ただし、特定のシナリオでは、文字列として保存されたクラス名に基づいてオブジェクトを動的に作成する方が有利な場合があります。これにより、柔軟性とコードの保守性が向上します。この記事では、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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート