首頁 >後端開發 >C++ >如何從類別名稱字串動態實例化 C 物件?

如何從類別名稱字串動態實例化 C 物件?

Susan Sarandon
Susan Sarandon原創
2024-12-19 20:40:10372瀏覽

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 Variant:

對於需要創建不相關類型的物件的場景,Boost庫提供了一個variant類型。此類型可以保存不同類型的值,可以根據儲存的類型資訊動態存取這些值。

typedef boost::variant<Foo, Bar, Baz> variant_type;
template <typename T> variant_type createInstance() { return variant_type(T()); }

結論

而C 缺乏直接的string-to -類型轉換,本文討論的替代方法提供了一種從字符串動態實例化對象的方法。透過利用映射結構、自動類別註冊或 Boost 變體類型,開發人員可以在物件導向的應用程式中實現更大的靈活性和程式碼可維護性。

以上是如何從類別名稱字串動態實例化 C 物件?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn