从函数结果中分配 std::shared_ptr 的一行是什么?
What's the one liner for assigning a std::shared_ptr from the result of a function?
必须有一种更惯用的方法可以做到这一点:
Potato SpecialPotato();
std::shared_ptr<Potato> givePotato()
{
std::shared_ptr<Potato> ret;
*ret = SpecialPotato();
return ret;
}
*ret = SpecialPotato();
不会起作用,因为ret
只是一个空指针,因为它是默认构造的。 如果要返回指向具有SpecialPotato()
返回值的Potato
的std::shared_ptr<Potato>
,则可以使用类似std::make_shared
std::shared_ptr<Potato> givePotato()
{
return std::make_shared<Potato>(SpecialPotato());
}
这将动态分配一个Potato
,用SpecialPotato()
的返回对其进行初始化,然后返回shared_ptr
。
请注意,如果SpecialPotato()
应该返回派生自Potato
的类型,则无法返回Potato
。 这将对对象进行切片,而您则丢失了对象的派生部分。 将派生类型作为父类型返回时,需要使用类似指针/指针的类型,例如
std::shared_ptr<Potato> SpecialPotato()
{
return std::make_shared<SpecialPotatoType>(/* constructor parameters here */);
}
使用std::make_shared
:
Potato SpecialPotato();
std::shared_ptr<Potato> givePotato()
{
return std::make_shared<Potato>(SpecialPotato());
}
它具有一次性构建std::shared_ptr
和对象副本的专业版。此外,副本可能会被优化出来。
相关文章:
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- C++避免重复声明的语法是什么
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 实现无开销push_back的最佳方法是什么
- C++从另一个类访问公共静态向量的正确方法是什么
- "throw expression code" 1e7 >返回 d 是什么?投掷标准::overflow_error( "too big" ) : d;意味 着?
- C++中名称篡改的目的是什么
- 在 c++ 中拥有一组结构的正确方法是什么?
- 这个指针和内存代码打印是什么?我不知道是打印垃圾还是如何打印我需要的值
- 是什么阻止DOMTimerCoordinator::NextID进入无休止的循环
- 派生类销毁的最佳实践是什么
- 以 LPCTSTR 开头编写另一行文本的最佳方法是什么?
- 在C++编程中继续下一行的另一种方法是什么?
- 在一行C 中,该代码后缀和前缀的输出的逻辑是什么
- 在这一行中,这是什么(i dir/2)%dir在dir_map [xdx] [ydy] =(i dir/2)%dir;
- 从函数结果中分配 std::shared_ptr 的一行是什么?
- 源代码中的这一行(cap>> frame;)是什么意思?
- Qt .pro 文件中这一行的含义是什么?
- 这一行在c++中是什么意思?
- Makefile中的这一行是什么意思?