c++ - 如何从包含该类名称的字符串创建一个类的对象?

标签 c++

假设我有一个字符串,其中包含我的类名:

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++ - 如何从包含该类名称的字符串创建一个类的对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6831261/

相关文章:

c++ - 如何确定 PdhExpandWildCardPath 结果中的主要网络适配器?

c++ - 你能用 lambda 比较器交换 std::queue 吗?

c++ - 一个字节中的两个值

c++ - 是否有 tbb::parallel_for 的中断命令

c++ - 在 lambda 表达式中使用外部函数

c++ - UE4项目链接错误,描述为空

内部类中的 C++ 模板运算符重载

c++ - "CMakeLists.txt"似乎丢失了

c++ - 在 C++ 中保存 QML 图像

c++ - 使用 OpenGL 在 C++ 中绘制 8 x 15 矩形网格 - 崩溃