Вопросы

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

У меня есть 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

Читать:
Я не могу воспроизвести видеопоток UDP с LibVLCSharp

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

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

Похожие записи

Каков наиболее эффективный способ чтения паркетного файла с разделами с помощью pyspark?

admin

Как применить политику IAM вызывающего абонента к выполнению лямбда-функции?

admin

PyInstaller не может проверить зависимости сборки

admin

Как собрать / скомпилировать облачные функции firebase с помощью webpack

admin

Примечание: неопределенный индекс: родительский при добавлении множественного выбора в админке Sonata

admin

Как проверить конкретную версию Subversion из командной строки?

admin