2016-11-23 85 views
2

假设我需要两个工厂的抽象基类及其派生类(我没有访问实际的构造函数)。在效率和代码风格方面,哪个是最好的构造?抽象基类和派生类的工厂函数的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工厂返回它是通过使用make_shared和源性拷贝构造(其导致许多拷贝构造调用构造的共享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); 
} 
+0

你打算做一些多态函数吗? – doctorlove

+0

@doctorlove你不能有一个没有多态的*抽象*基类(我认为你的意思是*虚拟*)函数,你能吗? :) – user2079303

回答

3

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

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


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

这导致许多拷贝构造函数调用

值返回工厂本身只复制如果对象是不动,constructible,如果优化没有实现复制省略(其中任何像样的优化器)。

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

0

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

使用工厂方法以逻辑术语选择合适的构造函数与管理对象所有权(通过共享指针)不同。