C ++从类指针调用构造函数?

时间:2017-11-03 14:49:08

标签: c++ types generic-programming

我希望能够从字符串初始化一个类(我给“MyClass”,它会创建一个对象MyClass)。

我知道不可能这样做所以我创建了一个类,它有一个带有字符串作为键的映射,以及一个指向函数(创建对象)的指针作为值。

动态创建对象对我和我的地图来说不是问题。

template<typename T> JsonSerializable* createInstance() { return new T; }

我的问题是我想动态地将类添加到我的地图中。那可能吗 ? 我该怎么做:

void MyFactory::addNewClass(std::string& name, class c)
{
    map[name]=&createInstance<c>();
}

我可以将指针或其他东西传递给类本身(而不是对象)吗?并使用它来动态创建所有内容。

如果不可能,我将不得不对其进行硬编码。

1 个答案:

答案 0 :(得分:1)

好的..所以,如果你正在使用C ++ 11,那么lambdas可以帮助你获得你正在寻找的通用行为。

首先,我们需要一个SuperBase,所有类都应该从这个

中派生出来
class SuperBase {};
class A : public SuperBase {};

class B: public SuperBase {};

然后创建一个以std::string为键,std::function为值的地图。

map<string,std::function<SuperBase*()>> myMap;

函数返回类型为SuperBaseaddNewClass函数可以定义为

template <typename type>
void addNewClass(std::string name) {
    myMap[name] = []() { return new type();};
  }

因此,从main函数可以将函数调用为

addNewClass<A>("A");
addNewClass<B>("B");

然后在迭代时你可以调用函数来获得所需的指针

 for( auto mapPair : myMap) {
        cout<<mapPair.first<<endl;
        SuperBase * sBase = mapPair.second();
    }

请记住,virtual中的SuperBase函数需要具有多态行为,然后一切都应该有效

希望有所帮助