从包含C++中类名的字符串动态创建类的实例

Sco*_*ott 11 c++ dynamic instance new-operator

假设我有一个有100个孩子的基类:

class Base { 
  virtual void feed();
  ...   
};
class Child1 : public Base {
  void feed();  //specific procedure for feeding Child1
  ... 
};
...
class Child100 : public Base { 
  void feed();  //specific procedure for feeding Child100
  ...
};
Run Code Online (Sandbox Code Playgroud)

在运行时,我想读取一个文件,其中包含要创建和提供的子项.假设我已经读过文件,字符串"names"的向量包含子类的名称(即Child1,Child4,Child99).现在,我将遍历这些字符串,创建特定子项的实例,并使用其特定的提供过程来提供它:

vector<Base *> children;    
for (vector<string>::iterator it = names.begin(); it != names.end(); ++it) {
  Base * child = convert_string_to_instance(*it)       
  child->feed()
  children.push_back(child);
}
Run Code Online (Sandbox Code Playgroud)

我如何创建函数convert_string_to_instance(),这样如果它接受字符串"Child1"它返回一个"new Child1",如果字符串参数是"Child4"它返回一个"new Child4",等等

<class C *> convert_string_to_instance(string inName) {
  // magic happens
  return new C;  // C = inName

  // <brute force?>
  // if (inName == "Child1")
  //   return new Child1;
  // if (inName == "Child2")
  //   return new Child2;    
  // if (inName == "Child3")
  //   return new Child3;    
  // </brute force>
  }
Run Code Online (Sandbox Code Playgroud)

Gre*_*ill 5

C++ 没有提供像这样动态构造类实例的方法。但是,您可以使用代码生成从类列表中生成“强力”代码(如上面所示)。然后,#include在您的方法中生成代码convert_string_to_instance

您还可以设置项目构建系统,以便在类列表发生更改时重建生成的代码。