Abstract Base 类 和 Derived 类 的工厂函数的 c++ return 类型
c++ return types for factory functions for Abstract Base Classes and Derived classes
假设我需要同时拥有抽象基础 class 及其派生 class 的工厂(我无法访问实际的构造函数)。就效率和代码风格而言,哪种结构最好?
1)让所有工厂return一个shared_ptr。这是统一的,但会导致派生的 class 产生许多不必要的 shared_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) 让派生的工厂classes return 一个值,并让ABC 工厂return 一个使用make_shared 构造的共享ptr 和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);
}
在 ABC 的情况下,您可以简单地 return 一个 unique_ptr
,以避免 shared_ptr
的开销。但是,只有当 ~AbstractBaseClass
是虚拟的时才可以选择。
通过 returning a unique_ptr
,您允许调用者决定是否需要共享对象。
当returning一个具体类型的对象时,returning一个值确实是一个很好的选择。这避免了动态分配的成本。
which lead to many copy constructor calls
值 returning 工厂本身仅在对象不可移动构造且优化器未实现复制省略(任何体面的优化器都这样做)时才复制。
您可以实现抽象指针 returning 工厂而不委托给值 returning 工厂,而是直接构造对象以避免复制(移动)。
两个工厂函数都应该return简单的指针。共享指针应该应用于它们的结果。
从逻辑上讲,使用工厂方法选择合适的构造函数不同于管理对象所有权(通过共享指针)。
假设我需要同时拥有抽象基础 class 及其派生 class 的工厂(我无法访问实际的构造函数)。就效率和代码风格而言,哪种结构最好?
1)让所有工厂return一个shared_ptr。这是统一的,但会导致派生的 class 产生许多不必要的 shared_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) 让派生的工厂classes return 一个值,并让ABC 工厂return 一个使用make_shared 构造的共享ptr 和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);
}
在 ABC 的情况下,您可以简单地 return 一个 unique_ptr
,以避免 shared_ptr
的开销。但是,只有当 ~AbstractBaseClass
是虚拟的时才可以选择。
通过 returning a unique_ptr
,您允许调用者决定是否需要共享对象。
当returning一个具体类型的对象时,returning一个值确实是一个很好的选择。这避免了动态分配的成本。
which lead to many copy constructor calls
值 returning 工厂本身仅在对象不可移动构造且优化器未实现复制省略(任何体面的优化器都这样做)时才复制。
您可以实现抽象指针 returning 工厂而不委托给值 returning 工厂,而是直接构造对象以避免复制(移动)。
两个工厂函数都应该return简单的指针。共享指针应该应用于它们的结果。
从逻辑上讲,使用工厂方法选择合适的构造函数不同于管理对象所有权(通过共享指针)。