Вопросы

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

У меня есть 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 ++ вызывает ли инициализация ссылки или указателя с самим собой UB?

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

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

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

Упаковка модели SpaCy с Pyinstaller: E050 Не могу найти модель

admin

ParseError: 172: 3: Тип сообщения object_detection.protos.TrainConfig не имеет поля с именем fine_tune_checkpoint_version

admin

Удалите файлы внутри подпапки, находящейся внутри корзины на amazon s3

admin

Google Cloud Platform: внешний IP-адрес недоступен извне

admin

Есть ли в Azure DevOps аналог выпусков GitHib?

admin

Несколько точек входа не работают в Symfony 4.4

admin