如何从包含类名的字符串中创建类的对象

How create an object of a Class from a string that holds the name of that class?

本文关键字:创建 对象 字符串 包含类      更新时间:2023-10-16

假设我有一个字符串,里面有我的类名:

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模式有一点不同,它使用指向基类的指针,并返回子类的实例。