gpt4 book ai didi

c++ - 将 shared_ptr 作为 shared_ptr 传递

转载 作者:IT老高 更新时间:2023-10-28 12:10:20 25 4
gpt4 key购买 nike

通过shared_ptr 的最佳方法是什么?将派生类型转换为采用 shared_ptr 的函数基本类型?

我一般通过shared_ptr s 通过引用避免不必要的复制:

int foo(const shared_ptr<bar>& ptr);

但如果我尝试做类似的事情,这不起作用

int foo(const shared_ptr<Base>& ptr);

...

shared_ptr<Derived> bar = make_shared<Derived>();
foo(bar);

我可以使用

foo(dynamic_pointer_cast<Base, Derived>(bar));

但这似乎不是最理想的,原因有两个:

  • 一个 dynamic_cast对于一个简单的派生到基础的转换来说似乎有点过分了。
  • 据我了解,dynamic_pointer_cast创建指针的拷贝(尽管是临时拷贝)以传递给函数。

有没有更好的解决方案?

后人更新:

原来是缺少头文件的问题。此外,我在这里尝试做的事情被认为是反模式。一般来说,

  • 不影响对象生命周期的函数(即对象在函数的持续时间内保持有效)应该采用普通引用或指针,例如int foo(bar& b) .

  • 使用一个对象的函数(即是给定对象的最终用户)应该采用 unique_ptr按值(value),例如int foo(unique_ptr<bar> b) .来电者应std::move函数中的值。

  • 延长对象生命周期的函数应采用 shared_ptr按值(value),例如int foo(shared_ptr<bar> b) .避免circular references 的常用建议适用。

参见 Herb Sutter 的 Back to Basics talk了解详情。

最佳答案

如果您忘记在派生类上指定 public 继承,也会发生这种情况,即,如果您像我一样写这个:

class Derived : Base
{
};

代替:

class Derived : public Base
{
};

关于c++ - 将 shared_ptr<Derived> 作为 shared_ptr<Base> 传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13403490/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com