【问题标题】:c++ return types for factory functions for Abstract Base Classes and Derived classes抽象基类和派生类的工厂函数的 c++ 返回类型
【发布时间】:2016-11-23 12:04:32
【问题描述】:

假设我需要一个抽象基类及其派生类的工厂(我无法访问实际的构造函数)。就效率和代码风格而言,哪个是最好的构造?

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工厂返回一个使用make_shared和Derived的拷贝构造函数构造的共享ptr(导致拷贝构造函数调用很多)

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 你不能有一个没有多态(我假设你的意思是 virtual)函数的 abstract 基类,可以吗? :)

标签: c++ c++11 return-value factory shared-ptr


【解决方案1】:

在 ABC 情况下,您可以简单地返回 unique_ptr,以避免 shared_ptr 的开销。但是,只有当~AbstractBaseClass 是虚拟的时,这才是一个选项。

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


当返回一个具体类型的对象时,返回一个值确实是一个很好的选择。这避免了动态分配的成本。

这会导致许多复制构造函数调用

只有在对象不可移动且优化器没有实现复制省略(任何体面的优化器都会这样做)的情况下,返回工厂本身的值才会复制。

您可以实现抽象指针返回工厂而不委托给值返回工厂,而是直接构造对象以避免该复制(移动)。

【讨论】:

    【解决方案2】:

    两个工厂函数都应该返回简单的指针。应将共享指针应用于其结果。

    从逻辑上讲,使用工厂方法选择适当的构造函数不同于管理对象所有权(通过共享指针)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-08
      • 2017-06-21
      • 2015-03-23
      • 1970-01-01
      • 1970-01-01
      • 2017-06-19
      相关资源
      最近更新 更多