C ++对象构造函数数组

时间:2016-05-01 07:00:52

标签: c++ design-patterns

我有几个名为Child1,Child2等的类,继承自对象Parent。我需要按名称创建一个对象,例如,如果我有字符串“Child1”,我需要创建对象Child1,依此类推。

我想到了类似的东西:

struct registry_entry {
    const char* name;
    IREGISTRY* (*initializer)(); 
};

struct registry_entry registry_list[] =
{
    {"xml", &REGISTRY_XML::REGISTRY_XML},
}

但是我无法得到对象构造函数的地址。我相信这个问题必须已经解决,解决方案很简单,但我找不到它。

2 个答案:

答案 0 :(得分:6)

构造函数和析构函数是特殊函数,不能通过函数指针访问。

您需要创建一个静态成员函数,如

struct REGISTRY_XML {
    static IREGISTRY* create();
};

因此您可以将其称为

struct registry_entry registry_list[] =
{
    {"xml", &REGISTRY_XML::create},
}

答案 1 :(得分:2)

你的代码看起来像非常类似C ++而不是C ++,但是如果你真的可以使用C ++ 11的全部功能,我会选择{{1}的组合},lambdas,std::functionstd::unique_ptr

Lambdas可以在不必编写单独的包装函数的情况下包装构造函数,std::map允许您将lambdas存储在映射中,std::function消除了许多内存管理错误,并且std::unique_ptr执行从字符串到初始化函数的实际映射。

这是一个完整的例子:

std::map