簡介
在物件導向程式設計中,實例化是常見的做法來自特定類別的物件。然而,在某些情況下,基於儲存為字串的類別名稱動態建立物件可能是有利的。這可以提供更高的靈活性和程式碼可維護性。本文探討了在 C 中實現動態物件建立的可能性。
使用字串到類型轉換的動態物件實例化
不幸的是,C 本身並沒有提供將保存類別名稱的字串轉換為實際類型信息的直接機制。這意味著靜態定義的類別不能在沒有明確程式碼變更的情況下動態實例化。
替代方法
雖然直接字串到類型的轉換不可用,但有實現動態物件創建的替代技術:
1。使用映射結構:
您可以在類別名稱(作為字串)和建立這些類別的實例的函數指標之間建立映射。這允許透過查找函數指標並呼叫它來動態創建物件。
templateBase* createInstance() { return new T; } std::map<:string base> map; map["DerivedA"] = &createInstance ; // ... and so on
2.自動類別註冊:
此方法涉及在編譯期間使用巨集或模板註冊類別。註冊的類別會自動添加到全域映射中,從而可以使用其名稱從任何註冊的類別建立物件。
#define REGISTER_DEC_TYPE(NAME) \ static DerivedRegisterreg #define REGISTER_DEF_TYPE(NAME) \ DerivedRegister NAME::reg(#NAME) class DerivedB { ...; REGISTER_DEF_TYPE(DerivedB); };
3.使用Boost Variant:
對於需要創建不相關類型的對象的場景,Boost庫提供了variant
typedef boost::variantvariant_type; template variant_type createInstance() { return variant_type(T()); }
結論
雖然C 缺乏直接的字串到型別的轉換,但本文討論的替代方法提供了一種從字串動態實例化物件的方法。透過利用映射結構、自動類別註冊或 Boost 變體類型,開發人員可以在物件導向的應用程式中實現更大的靈活性和程式碼可維護性。
免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。
Copyright© 2022 湘ICP备2022001581号-3