东方耀AI技术分享

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 活动 交友 discuz
查看: 1297|回复: 2
打印 上一主题 下一主题

[C/C++] 智能指针:shared_ptr托管this指针与dynamic_pointer_cast向下转换

[复制链接]

1365

主题

1856

帖子

1万

积分

管理员

Rank: 10Rank: 10Rank: 10

积分
14439
QQ
跳转到指定楼层
楼主
发表于 2021-10-13 13:33:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式





智能指针:shared_ptr托管this指针与dynamic_pointer_cast向下转换




  1. #include <iostream>
  2. #include <memory>

  3. using namespace std;

  4. class Base;
  5. class Derived;

  6. void function1(std::shared_ptr<Base> sptr_base_class)
  7. {
  8.     // ...
  9. }

  10. // /使用 shared_ptr 托管的 this 指针
  11. class Base : public std::enable_shared_from_this<Base>
  12. {
  13. public:
  14.     Base()
  15.     { /* ... */
  16.     }
  17.     virtual ~Base() {}

  18.     void method()
  19.     {
  20.         // ...

  21.         // 传递该类shared_ptr托管的this指针
  22.         function1(shared_from_this());
  23.     }
  24.     // ...

  25. private:
  26.     // ...
  27. };

  28. void function2(std::shared_ptr<Derived>& sptr_sub_class)
  29. {
  30.     // ...
  31. }

  32. class Derived : public Base
  33. {
  34. public:
  35.     Derived()
  36.     { /* ... */
  37.     }
  38.     ~Derived() {}

  39.     void method(std::shared_ptr<Derived> derived)
  40.     {
  41.         // ...

  42.         // 错误:不存在用户定义的从“std::shared_ptr<Base>”到“std::shared_ptr<Derived>”的适当转换
  43.         // function2(shared_from_this());
  44.         //分析其原因,是因为 Base 在继承enable_shared_from_this<T>时,向模板T传递的类型为Base,
  45.         //也就是 shared_from_this() 函数返回值类型被设定为了 std::shared_ptr<Base>。
  46.         //所以在 Derived 中调用 shared_from_this(),返回值就是std::shared_ptr<Base>了。
  47.         //由于我们无法将裸指针或是智能指针从基类隐性转换至派生类,所以会发生以上错误
  48.         std::shared_ptr<Derived> pointer = std::dynamic_pointer_cast<Derived>(shared_from_this());
  49.         //最后需要注意两点:
  50.         //1、使用std::dynamic_pointer_cast<T>()需要基类中存在虚函数
  51.         //这是由于这个转换函数使用输入的类型和目标类型中是否存在相同签名的虚函数作为转换能否成功的标识
  52.         //最简单也是正确的解决方法是将基类中的析构函数声明为虚函数
  53.         //2、不能在构造函数中使用shared_form_this()
  54.         function2(pointer);
  55.     }

  56. private:
  57.     // ...
  58. };

  59. int main()
  60. {
  61.     std::cout << "智能指针:shared_ptr托管this指针与dynamic_pointer_cast向下转换" << endl;
  62.     std::shared_ptr<Derived> derived = std::make_shared<Derived>();
  63.     derived->method(derived);

  64.     return 0;
  65. }
复制代码





让天下人人学会人工智能!人工智能的前景一片大好!
回复

使用道具 举报

1365

主题

1856

帖子

1万

积分

管理员

Rank: 10Rank: 10Rank: 10

积分
14439
QQ
沙发
 楼主| 发表于 2021-10-13 13:59:44 | 只看该作者
也可以这样写,注意:dynamic_pointer_cast<>里面写的是管理资源的类 非共享指针的类
std::dynamic_pointer_cast<Derived, Base>(shared_from_this());
让天下人人学会人工智能!人工智能的前景一片大好!
回复

使用道具 举报

0

主题

98

帖子

200

积分

中级会员

Rank: 3Rank: 3

积分
200
板凳
发表于 2021-11-23 19:26:01 | 只看该作者
让天下人人学会人工智能!人工智能的前景一片大好!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|人工智能工程师的摇篮 ( 湘ICP备2020019608号-1 )

GMT+8, 2024-5-19 14:43 , Processed in 0.170939 second(s), 18 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表