有一个更惯用的方法来做到这一点:
Potato SpecialPotato();
std::shared_ptr<Potato> givePotato()
{
std::shared_ptr<Potato> ret;
*ret = SpecialPotato();
return ret;
}
Run Code Online (Sandbox Code Playgroud)
*ret = SpecialPotato();ret因为它是默认构造的,所以不会像空指针一样工作.如果你想返回一个带有返回值的std::shared_ptr<Potato>a Potato,SpecialPotato()你可以使用std::make_sharedlike
std::shared_ptr<Potato> givePotato()
{
return std::make_shared<Potato>(SpecialPotato());
}
Run Code Online (Sandbox Code Playgroud)
这将动态分配a Potato,用return返回初始化SpecialPotato()然后返回shared_ptr.
请注意,如果SpecialPotato()应该返回从中派生的类型,则Potato无法返回Potato.这将切割对象,您将丢失对象的派生部分.将派生类型作为父类型返回时,需要使用类似指针/指针的类型
std::shared_ptr<Potato> SpecialPotato()
{
return std::make_shared<SpecialPotatoType>(/* constructor parameters here */);
}
Run Code Online (Sandbox Code Playgroud)