C++ 如何从保存类名称的字符串创建类的对象?
假设我有一个字符串,里面有我的类名:C++ 如何从保存类名称的字符串创建类的对象?,c++,C++,假设我有一个字符串,里面有我的类名: mystring = "CDialogChild"; 我想创建一个类型名称写在字符串中的对象。 我想做一些类似的事情: CDialogParent dlg = CDialogParent(mystring); 我的新dlg现在创建为CDialogChild类型,我可以使用它的方法: dlg.mycdialogchild_method(); 一般来说,这在语言中是不可能的,因为C++不是反射语言,它是静态类型的。 作为替代,您可以考虑将具有公共基类的相关
mystring = "CDialogChild";
我想创建一个类型名称写在字符串中的对象。
我想做一些类似的事情:
CDialogParent dlg = CDialogParent(mystring);
我的新dlg现在创建为CDialogChild类型,我可以使用它的方法:
dlg.mycdialogchild_method();
一般来说,这在语言中是不可能的,因为C++不是反射语言,它是静态类型的。
作为替代,您可以考虑将具有公共基类的相关、多态类型的集合硬编码到程序中,并编写一个工厂方法,该方法基于运行时参数创建所需的具体实例。
< P>没有任何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;
};
类IClassFactory//基本接口
{公众:
虚拟~IClassFactory(){}
}
模板或者,您可以使用允许反射的脚本语言,但这将为您的应用程序添加一个完整的层。可能与C++嵌入相关的脚本语言:CaaScript、FalCon、Lua、Python、AngelScript、MonkeyScript、IO、……/P>< P>有一个设计模式来完成你的目标:工厂。 您需要比较类名并返回对象:
class MyObject;
MyObject * creator(const std::string& object_name)
{
return (object_name == "MyObject") ? new MyObject : 0;
}
工厂模式有点不同,它使用指向基类的指针并返回子类的实例。复制“我可以使用它的方法”的可能副本-您永远不能使用变量类型没有的成员函数
CDialogParent
没有成员函数mycdialogchild\u方法
。但是我的dlg不是CDialogParent类型!这是CDialogChild的类型,这个有CDialogChild顺便说一句,你不需要在类名前面加上“C”。这是一种Microsoft技术,用于避免与其他代码的命名冲突。因此,不要重复他们的风格,防止自己与他们的代码发生冲突。