Заводская функция, возвращающая объект определенного типа — как это сделать лучше

У меня есть 3 класса B, C, D, которые происходят от одного базового класса A:

class A { // body }; class B : public A { // body }; class C : public A { // body }; class D : public A { // body };

Я хочу создать фабричную функцию, которая позволит мне создать объект определенного типа (B, C или D) и вернуть его как указатель на класс A:

typedef std::shared_ptr<A> a_ptr; a_ptr createObject(int type) { switch(type) { case 0: return a_ptr(new B()); break; case 1: return a_ptr(new C()); break; case 2: return a_ptr(new D()); break; } }

А затем, если у меня есть, например, указатель типа B, я бы хотел назначить ему объект B, созданный фабрикой. Единственное разумное решение, которое пришло мне в голову, было бы:

std::shared_ptr<B> b = std::shared_ptr<B>(dynamic_cast<B*>(createObject(0)));

Но выглядит некрасиво. Есть ли лучшее решение для этого? Или, может быть, мне стоит попробовать другой способ создания объектов с моей функцией?

Если вы создаете объекты на основе значения времени выполнения (здесь int type), тогда нет возможности правильного ввода возвращаемого значения (это было бы возможно, если бы createObject был шаблоном, но тогда вы могли бы создавать только статически), так что гипс необходим. Вы могли бы придумать способы скрыть это, но ИМХО, это плохая идея. Отливки должны быть заметными.   —  person Piotr Chojnacki    schedule 07.03.2013

C ++ статически типизирован. То есть вы должны знать тип каждого выражения во время компиляции. (В вашем случае это должен быть тип A.)   —  person Piotr Chojnacki    schedule 07.03.2013

Обратите внимание, что shared_ptrs имеют свои собственные методы преобразования.   —  person Piotr Chojnacki    schedule 07.03.2013

Источник: ledsshop.ru

Стиль жизни - Здоровье!