C++ 从 class 指针调用构造函数?
C++ call constructor from class pointer?
我希望能够从字符串初始化 class(我给 "MyClass",它会创建一个对象 MyClass)。
我知道这是不可能的,所以我创建了一个 class,它有一个映射,其中一个字符串作为键,一个指向函数(创建对象)的指针作为值。
动态创建对象不是这个和我的地图的问题。
template<typename T> JsonSerializable* createInstance() { return new T; }
我的问题是我想动态添加 classes 到我的地图。那可能吗 ?
我该怎么做:
void MyFactory::addNewClass(std::string& name, class c)
{
map[name]=&createInstance<c>();
}
我可以将指针或其他东西传递给 class 本身(不是对象)吗?并使用它来动态创建一切。
如果不可能,我将不得不对其进行硬编码。
好的.. 因此,如果您使用的是 C++11,那么 lambda 可以帮助您获得您正在寻找的通用行为。
首先,我们需要一个 SuperBase
,所有的 类 都应该像这样导出
class SuperBase {};
class A : public SuperBase {};
class B: public SuperBase {};
然后创建一个以std::string
为键,std::function
为值的映射。
map<string,std::function<SuperBase*()>> myMap;
函数return类型为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();
}
请记住,您需要 SuperBase
中的 virtual
个函数才能具有多态行为,然后一切正常
希望对你有帮助
我希望能够从字符串初始化 class(我给 "MyClass",它会创建一个对象 MyClass)。
我知道这是不可能的,所以我创建了一个 class,它有一个映射,其中一个字符串作为键,一个指向函数(创建对象)的指针作为值。
动态创建对象不是这个和我的地图的问题。
template<typename T> JsonSerializable* createInstance() { return new T; }
我的问题是我想动态添加 classes 到我的地图。那可能吗 ? 我该怎么做:
void MyFactory::addNewClass(std::string& name, class c)
{
map[name]=&createInstance<c>();
}
我可以将指针或其他东西传递给 class 本身(不是对象)吗?并使用它来动态创建一切。
如果不可能,我将不得不对其进行硬编码。
好的.. 因此,如果您使用的是 C++11,那么 lambda 可以帮助您获得您正在寻找的通用行为。
首先,我们需要一个 SuperBase
,所有的 类 都应该像这样导出
class SuperBase {};
class A : public SuperBase {};
class B: public SuperBase {};
然后创建一个以std::string
为键,std::function
为值的映射。
map<string,std::function<SuperBase*()>> myMap;
函数return类型为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();
}
请记住,您需要 SuperBase
中的 virtual
个函数才能具有多态行为,然后一切正常
希望对你有帮助