Есть хороший трюк, который позволяет вам написать factory method без последовательности if...else if...
.
(обратите внимание, что, AFAIK, это действительно невозможно сделать то, что вы хотите в C++, как этот код генерируется во время компиляции. А «фабричный метод» Design Pattern существует для этой цели)
Во-первых, вам определите global repository
для ваших производных классов. Он может быть в форме std::map<std::string, Base*>
, то есть отображает имя производного класса в an instance
этого класса.
Для каждого производного класса вы определяете default constructor
, который добавляет объект этого класса в репозиторий под именем класса.Вы также определить статический экземпляр класса:
// file: der1.h
#include "repository.h"
class Der1: public Base {
public:
Der1() { repository[std::string("Der1")] = this; }
};
// file: der1.cpp
static Der1 der1Initializer;
Конструкторов статических переменных выполняются еще до main()
, так что, когда ваш main
начинается у вас уже есть репозиторий инициализирован с экземплярами всех производных классов.
Ваш заводской метод (например, Base::getObject(const std::string&)
) должен искать карту репозитория для имени класса. Затем он использует метод clone()
объекта, который он находит, чтобы получить новый объект того же типа. Разумеется, вам необходимо реализовать clone
для каждого подкласса.
Преимущество этого подхода заключается в том, что при добавлении нового производного класса ваши добавления ограничиваются только файлом (-ами), реализующим новый класс. Репозиторий и заводской код не изменятся. Конечно, вам все равно придется перекомпилировать вашу программу.
Звучит специфический для ОС вопрос. О какой ОС мы говорим? –
@sad_man, посмотрите на обновление, пожалуйста. Мне нужна кроссплатформенная версия. – Ockonal
Как можно «изменить число производных»? Вы хотите назвать производные от внешней библиотеки, которая скомпилирована после вашего приложения? –