Допустим, у меня есть базовый класс со 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
...
};
Во время выполнения я хочу прочитать файл, который содержит дочерние элементы для создания и подачи. Допустим, что я прочитал файл, а вектор строк "имена" содержит имена дочерних классов (например, 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);
}
Как создать функцию convert_string_to_instance() так, чтобы, если она принимает строку "Child1", она возвращает "новый Child1", если строковый аргумент "Child4", он возвращает "новый 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>
}