Предположим, мне нужно иметь обе фабрики для абстрактного базового класса и его производных классов (у меня нет доступа к фактическим конструкторам). Что было бы лучшей конструкцией с точки зрения эффективности и стиля кода?C++ возвращаемые типы для заводских функций для абстрактных базовых классов и производных классов
1) Пусть все заводы возвратят shared_ptr. Это однородно, но приводит к множеству ненужных shared_ptrs для производных классов, поскольку они непосредственно разыменовываются в клиентском коде.
std::shared_ptr<Derived> createDerived(Argument arg)
{
return std::make_shared<Derived>(arg);
}
std::shared_ptr<AbstractBaseClass> createABC(Argument arg)
{
if (suchAndSo(arg))
return createDerived(arg);
else
return nullptr; // or createSomeOtherDerivedClass
}
int main()
{
Argument Arg;
Derived d = *createDerived(arg);
auto pAbc = createABC(arg);
}
2) Пусть заводы для производных классов возвращают значение, и пусть завод ABC возвращает общий PTR, который строится с помощью make_shared и копирования конструктор Derived (которые приводят ко многим вызовов конструктора копирования)
Derived createDerived(Argument arg)
{
return Derived(arg);
}
std::shared_ptr<AbstractBaseClass> createABC(Argument arg)
{
if (suchAndSo(arg))
return make_shared<AbstractBaseClass>(createDerived(arg));
else
return nullptr; // or createSomeOtherDerivedClass
}
int main()
{
Argument Arg;
Derived d = createDerived(arg);
auto pAbc = createABC(arg);
}
Планируете ли вы иметь некоторые полиморфные функции? – doctorlove
@doctorlove вы не можете иметь * абстрактный * базовый класс без полиморфного (по которому я предполагаю, что вы имеете в виду функцию * virtual *), не так ли? :) – user2079303