加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 如何使用unique_ptr执行dynamic_cast?

发布时间:2020-12-16 05:57:25 所属栏目:百科 来源:网络整理
导读:我有一个类层次结构如下: class BaseSession : public boost::enable_shared_from_thisBaseSessionclass DerivedSessionA : public BaseSessionclass DerivedSessionB : public BaseSession 在派生类函数中,我经常调用这样的函数: Func(boost::dynamic_poi
我有一个类层次结构如下:
class BaseSession : public boost::enable_shared_from_this<BaseSession>
class DerivedSessionA : public BaseSession
class DerivedSessionB : public BaseSession

在派生类函数中,我经常调用这样的函数:

Func(boost::dynamic_pointer_cast<DerivedSessionA>(shared_from_this()));

由于我正在使用shared_ptr来管理会话,所以这是正常的.最近,我发现我使用shared_ptr对于这种情况并不是最佳的.那是因为这些会话是每个客户端保持一个套接字的单例对象.如果套接字重新连接,则会话副本用于成为僵尸.

作为解决方法,我开始通过引用传递shared_ptr而不是副本.这解决了僵尸问题.

理想情况下,我觉得我应该使用unique_ptr存储会话,然后传递给其他函数的引用.这打开了一整套蠕虫.

如何将基类unique_ptr对象转换为派生类unique_ptr对象?以下行的unique_ptr版本是什么?

Func(boost::dynamic_pointer_cast<DerivedSessionA>(shared_from_this()));

我只想要一个会话对象的副本,其他的都应该是引用的.

解决方法

除非您要转让std :: unique_ptr< T>的所有权,否则您的函数应该指向或指向T.

所以Func的签名应该是Func(DerivedSessionA *)

然后你的电话可能看起来像:

std::unique_ptr<BaseSession> ptr; // Initialize it with correct value

Func(dynamic_cast<DerivedSessionA*>(ptr.get()));

或者您似乎直接从BaseSession中的方法调用它:

Func(dynamic_cast<DerivedSessionA*>(this));

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读