我有几个名为Child1,Child2等的类,继承自对象Parent。我需要按名称创建一个对象,例如,如果我有字符串“Child1”,我需要创建对象Child1,依此类推。
我想到了类似的东西:
struct registry_entry {
const char* name;
IREGISTRY* (*initializer)();
};
struct registry_entry registry_list[] =
{
{"xml", ®ISTRY_XML::REGISTRY_XML},
}
但是我无法得到对象构造函数的地址。我相信这个问题必须已经解决,解决方案很简单,但我找不到它。
答案 0 :(得分:6)
构造函数和析构函数是特殊函数,不能通过函数指针访问。
您需要创建一个静态成员函数,如
struct REGISTRY_XML {
static IREGISTRY* create();
};
因此您可以将其称为
struct registry_entry registry_list[] =
{
{"xml", ®ISTRY_XML::create},
}
答案 1 :(得分:2)
你的代码看起来像非常类似C ++而不是C ++,但是如果你真的可以使用C ++ 11的全部功能,我会选择{{1}的组合},lambdas,std::function
和std::unique_ptr
。
Lambdas可以在不必编写单独的包装函数的情况下包装构造函数,std::map
允许您将lambdas存储在映射中,std::function
消除了许多内存管理错误,并且std::unique_ptr
执行从字符串到初始化函数的实际映射。
这是一个完整的例子:
std::map