【发布时间】: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