简介
在面向对象编程中,实例化是常见的做法来自特定类的对象。然而,在某些情况下,基于存储为字符串的类名动态创建对象可能是有利的。这可以提供更高的灵活性和代码可维护性。本文探讨了在 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中文网其他相关文章!