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

C++ call constructor from class pointer?

本文关键字:构造函数 调用 指针 C++      更新时间:2023-10-16

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

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

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

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

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

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

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

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

好的。因此,如果您使用的是 C++11,那么 lambda 可以帮助获得您正在寻找的通用行为。

首先,我们需要一个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函数才能具有多态行为,然后一切都应该正常工作

希望对你有帮助