我希望能够从字符串初始化一个类(我给“ MyClass”,它将创建一个对象MyClass)。
我知道不可能这样做,所以我创建了一个类,该类具有一个以字符串为键的映射和一个指向函数(创建对象)的指针作为值的映射。
动态创建对象与我的地图无关。
template<typename T> JsonSerializable* createInstance() { return new T; }
我的问题是我想将类动态添加到地图中。那可能吗 ?
我能怎么做 :
void MyFactory::addNewClass(std::string& name, class c)
{
map[name]=&createInstance<c>();
}
我可以将指针或其他内容传递给类本身(而不是对象)吗?并使用它动态创建所有内容。
如果不可能的话,我将不得不对其进行硬编码。
最佳答案:
SuperBase
class SuperBase {};
class A : public SuperBase {};
class B: public SuperBase {};
然后创建一个以
std::string
为键,以std::function
为值的映射。map<string,std::function<SuperBase*()>> myMap;
函数返回类型为
SuperBase
,并且addNewClass
函数可以定义为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
函数具有多态行为,然后一切正常希望能帮助到你