Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/149.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何从保存类名称的字符串创建类的对象?_C++ - Fatal编程技术网

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(){} } 模板 类工厂{ /*这里需要什么*/ 公众: T*create(); }; 班级经理 { 公众: void add(std::string name,IClassFactory*factory){m_map[name]=factory;} ACommonBaseClass*create(std::string class_name){return m_map[class_name]->create();}//这行代码不正确,但您知道了 私人: 标准::映射<标准::字符串,IClassFactory*>m_映射; }; 或者类似的东西(写得很快)


或者,您可以使用允许反射的脚本语言,但这将为您的应用程序添加一个完整的层。可能与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技术,用于避免与其他代码的命名冲突。因此,不要重复他们的风格,防止自己与他们的代码发生冲突。