要做到这一点还有一种更惯用的方式:
Potato SpecialPotato();
std::shared_ptr<Potato> givePotato()
{
std::shared_ptr<Potato> ret;
*ret = SpecialPotato();
return ret;
}
答案 0 :(得分:5)
*ret = SpecialPotato();
不起作用,因为ret
只是一个空指针,因为它是默认构造的。如果您想要返回std::shared_ptr<Potato>
指向Potato
并返回SpecialPotato()
的值,那么您可以使用std::make_shared
std::shared_ptr<Potato> givePotato()
{
return std::make_shared<Potato>(SpecialPotato());
}
这将动态分配Potato
,使用SpecialPotato()
的返回值对其进行初始化,然后返回shared_ptr
。
请注意,如果SpecialPotato()
应该返回从Potato
派生的类型,则您无法返回Potato
。那将是slice the object而你丢失了对象的派生部分。将派生类型作为父类型返回时,需要使用类似指针/指针的类型,如
std::shared_ptr<Potato> SpecialPotato()
{
return std::make_shared<SpecialPotatoType>(/* constructor parameters here */);
}
答案 1 :(得分:0)
Potato SpecialPotato();
std::shared_ptr<Potato> givePotato()
{
return std::make_shared<Potato>(SpecialPotato());
}
它有专业人员在一次传递中构建std::shared_ptr
和对象副本。此外,副本可能会被优化。