用于抽象基类和派生类的工厂功能的C 返回类型

c++ return types for factory functions for Abstract Base Classes and Derived classes

本文关键字:工厂 功能 返回类型 抽象 基类 派生 用于      更新时间:2023-10-16

假设我需要两个工厂用于抽象基类及其派生的类(我无法访问实际的构造函数)。关于效率和代码样式,哪个是最好的结构?

1)让所有工厂返回共享_ptr。这是统一的,但导致许多不必要的共享_ptr用于派生类,因为它们直接在客户端代码中删除。

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,该PTR是通过使用make_shared和派生的复制构造函数构造的(导致许多复制构造函数调用)

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);
}

在ABC情况下,您可以简单地返回unique_ptr,以避免shared_ptr的开销。但是,仅当~AbstractBaseClass是虚拟的时才。

通过返回unique_ptr,您允许呼叫者决定是否需要共享对象。


返回混凝土类型的对象时,返回值确实是一个绝佳的选择。避免了动态分配的成本。

导致许多复制构造函数

值返回工厂本身仅在对象不可移动时复制,并且当优化器不实现复制elision(任何不错的优化器所使用)时。

您可以在不委派返回工厂的情况下实现抽象指针返回工厂,而是直接构建对象以避免该副本(移动)。

两个出厂功能都应返回简单的指针。共享指针应适用于其结果。

用逻辑术语选择适当的构造函数,与管理对象所有权(通过共享指针)不同。