假设我的班级名字里面有一个字符串:
mystring = "CDialogChild";
我想创建一个在我的字符串中写入的类型名称的对象。 我想做点什么:
CDialogParent dlg = CDialogParent(mystring);
我的新dlg现在创建为CDialogChild类型,我可以使用它的方法:
dlg.mycdialogchild_method();
答案 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模式稍有不同,它使用指向基类的指针并返回子类的实例。