如何从包含类名的字符串中创建类的对象
How create an object of a Class from a string that holds the name of that class?
假设我有一个字符串,里面有我的类名:
mystring = "CDialogChild";
我想创建一个对象的类型名称写在我的字符串。我想这样做:
CDialogParent dlg = CDialogParent(mystring);
我的新dlg现在被创建为CDialogChild类型,我可以使用它的方法:
dlg.mycdialogchild_method();
c++中没有任何东西可以提供这样的特性(称为反射)。
然而,如果你的类是有限的,你可以用一些工厂做一些映射:
class IClassFactory // base interface
{ public:
virtual ~IClassFactory(){}
}
template< class T >
class ClassFactory {
/* whatever necessary here*/
public:
T* create();
};
class ClassManager
{
public:
void add( std::string name, IClassFactory* factory ) { m_map[name] = factory; }
ACommonBaseClass* create( std::string class_name ) { return m_map[class_name]->create(); } // this line isn't correct but you get the idea
private:
std::map< std::string, IClassFactory* > m_map;
};
或者类似的东西(写得很快)
或者,您可以使用允许反射的脚本语言,但这将为您的应用程序添加整个层。可能对c++嵌入感兴趣的脚本语言:ChaiScript, Falcon, Lua, Python, AngelScript, MonkeyScript, Io,…
一般来说,这在语言中是不可能的,因为c++不是反射语言,它是静态类型的。
作为一种替代方法,您可以考虑将带有公共基类的相关多态类型集合硬编码到程序中,并编写一个工厂方法,该方法基于运行时参数创建所需的具体实例。
有一个完成你的目标的设计模式:工厂。您需要比较类名并返回对象:
class MyObject;
MyObject * creator(const std::string& object_name)
{
return (object_name == "MyObject") ? new MyObject : 0;
}
Factory模式有一点不同,它使用指向基类的指针,并返回子类的实例。
相关文章:
- 使用基类指针创建对象时,缺少派生类析构函数
- 如何创建对象函数指针C++映射?
- C++创建对象数组
- 在 C++ 的 Switch Case 中创建对象后对对象调用方法
- 如何获取在 main() 函数中构造的类的创建对象?
- 基于文件中的条目创建对象
- 错误:创建对象后无法分配区域
- C++ 通过输入创建对象
- 堆还是堆栈用于创建对象?
- 使用 C++ 创建对象数组
- 使用unique_ptr创建对象
- C++递归地在类构造函数中创建对象
- 通过向构造函数其他对象引用页面来创建对象
- ReactiveX (rx) - 在对象上应用可观察对象,而不是在可观察对象中创建对象
- 如何在OSX上正确创建C++对象文件(.o)
- 编译器是否会创建vtable,而不考虑在c++中创建对象
- 创建对象并防止被破坏
- 在C++中,友元类可以从友元类创建对象吗
- 只在堆中创建C++对象
- 创建用户定义的复制构造函数时无法创建对象