Шаблон для инициализации неизвестного подкласса - PullRequest
0 голосов
/ 20 августа 2009

Я пытаюсь создать функцию f, которая работает следующим образом:

StorageObject::addItem (const AbstractBase& base) {
    AbstractBase* storage = new Derived1(base);
}

Однако я бы хотел, чтобы f работал с классами Derived2, Derived3 и т. Д. Есть ли способ заставить f вызвать правильный конструктор в зависимости от переданного ему конкретного подкласса AbstractBase, без использования кодов типов?

Чтобы поставить вопрос в контексте, я использую эту функцию для инициализации списка объектов в классе. Хотя я мог бы сделать что-то вроде

Derived1* temp = new Derived1();
storageobject.addItem(*temp);
delete temp;

Я бы предпочел сделать что-то вроде

storageobject.addItem(Derived1());

и все объекты хранилища обрабатывают все.

Ответы [ 2 ]

2 голосов
/ 20 августа 2009

Почему бы вам не реализовать метод виртуального копирования?

AbstractBase* storage = base.Copy()

Кстати, это довольно специфично для C ++, потому что с помощью C # это может быть просто реализовано с помощью отражения.

Activiator.CreateInstance(temp.GetType(), temp);

Конечно, есть несколько хороших фабричных шаблонов, но это действительно зависит от конкретной проблемы, которую нужно решить.

0 голосов
/ 20 августа 2009
  • Если вы можете использовать шаблоны.
  • Если у вас нет шаблонов в языке - используйте абстрактный шаблон фабрики
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...