如何从包含该类名称的字符串创建类的对象?

时间:2011-07-26 14:04:52

标签: c++

假设我的班级名字里面有一个字符串:

mystring = "CDialogChild";

我想创建一个在我的字符串中写入的类型名称的对象。 我想做点什么:

CDialogParent dlg = CDialogParent(mystring);

我的新dlg现在创建为CDialogChild类型,我可以使用它的方法:

dlg.mycdialogchild_method();

3 个答案:

答案 0 :(得分:1)

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,......

答案 1 :(得分:0)

一般来说,这在语言中是不可能的,因为C ++不是一种反射语言,而是静态类型。

作为替代方案,您可以考虑将具有公共基类的相关多态类型集合硬编码到程序中,并编写工厂方法,根据运行时参数创建所需的具体实例。

答案 2 :(得分:0)

有一种完成目标的设计模式:工厂。 您需要比较类名并返回对象:

class MyObject;

MyObject * creator(const std::string& object_name)
{
  return (object_name == "MyObject") ? new MyObject : 0;
}

Factory模式稍有不同,它使用指向基类的指针并返回子类的实例。