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