首先,要使用ref_ptr的类必须继承自Referenced类(当然Referenced本身肯定也可以),这样才能使用->ref()和unref(),才能正确,ref_ptr其实本身是一个类,后面的是它的对象,但是它重载了->符号,使得它的对象表现得像一个指针的特性一样,所以叫智能指针,这里实现的方法为引用计数。

然后让我们进入ref_ptr的内部:

第一句:ref_ptr() : _ptr(0) {}

解析:构造函数,把内置变量_ptr置0,用例一般为:osg::ref_ptr<osg::Node> node;这样就用到了这个构造函数

第二句:ref_ptr(T* ptr) : _ptr(ptr) { if (_ptr) _ptr->ref(); }

解析:重载的构造函数,新申请一个T*的指针赋值给_ptr,_ref()表示为内存的计时器+1,用例一般为:osg::ref_ptr<osg::Node> node(new osg::Node);

第三句:ref_ptr(const ref_ptr& rp) : _ptr(rp._ptr) { if (_ptr) _ptr->ref(); }

解析:拷贝构造函数,其对象将指向一个已有的智能指针对象,同时对象的内存计数器值加一,用例一般为:osg::ref_ptr<osg::Node> node1(new osg::Node);osg::ref_ptr<osg::Node> node2(node1);

第四句: template<class Other> ref_ptr(const ref_ptr<Other>& rp) : _ptr(rp._ptr) { if (_ptr) _ptr->ref(); }

解析:也是拷贝构造函数,将对象_ptr指向一个已有的智能指针对象rp._ptr,同时对象的内存计数器值加一,用例一般为:osg::ref_ptr<osg::Group> node1(new osg::Group);osg::ref_ptr<osg::Node> node2(node1);

第五句:~ref_ptr() { if (_ptr) _ptr->unref();  _ptr = 0; }

解析:析构函数,执行时对象的内存计数器值减一;

第六句:ref_ptr& operator = (const ref_ptr& rp){assign(rp);return *this;}和第七句inline ref_ptr& operator = (T* ptr){....}

解析:与第三句和第二句相似,相当于把()变成了=号;

第八句:T* operator->() const { return _ptr; }

解析:返回内置变量的指针_ptr,相当于重载的->符号,用例:osg::ref_ptr<osg::Group> node=new osg::Group;node->addchild(..)

第九句:T& operator*() const { return *_ptr; }

解析:返回自己的引用(解引用);

第十句:T* get() const { return _ptr; }

解析:设置一个成员函数返回内置变量的指针_ptr,用例:node1->addchild(node2.get());

如有错误,欢迎指正!

详解osg::ref_ptr的更多相关文章

  1. [原][osg]Geometry详解

    //geometry成员变量 PrimitiveSetList _primitives; osg::ref_ptr<Array> _vertexArray; //顶点 osg::ref_p ...

  2. Qt开发技术:QCharts(三)QCharts样条曲线图介绍、Demo以及代码详解

    若该文为原创文章,未经允许不得转载原博主博客地址:https://blog.csdn.net/qq21497936原博主博客导航:https://blog.csdn.net/qq21497936/ar ...

  3. FFmpeg开发笔记(五):ffmpeg解码的基本流程详解(ffmpeg3新解码api)

    若该文为原创文章,未经允许不得转载原博主博客地址:https://blog.csdn.net/qq21497936原博主博客导航:https://blog.csdn.net/qq21497936/ar ...

  4. Linq之旅:Linq入门详解(Linq to Objects)

    示例代码下载:Linq之旅:Linq入门详解(Linq to Objects) 本博文详细介绍 .NET 3.5 中引入的重要功能:Language Integrated Query(LINQ,语言集 ...

  5. 架构设计:远程调用服务架构设计及zookeeper技术详解(下篇)

    一.下篇开头的废话 终于开写下篇了,这也是我写远程调用框架的第三篇文章,前两篇都被博客园作为[编辑推荐]的文章,很兴奋哦,嘿嘿~~~~,本人是个很臭美的人,一定得要截图为证: 今天是2014年的第一天 ...

  6. EntityFramework Core 1.1 Add、Attach、Update、Remove方法如何高效使用详解

    前言 我比较喜欢安静,大概和我喜欢研究和琢磨技术原因相关吧,刚好到了元旦节,这几天可以好好学习下EF Core,同时在项目当中用到EF Core,借此机会给予比较深入的理解,这里我们只讲解和EF 6. ...

  7. Java 字符串格式化详解

    Java 字符串格式化详解 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 文中如有纰漏,欢迎大家留言指出. 在 Java 的 String 类中,可以使用 format() 方法 ...

  8. Android Notification 详解(一)——基本操作

    Android Notification 详解(一)--基本操作 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/Notification 文中如有纰 ...

  9. Android Notification 详解——基本操作

    Android Notification 详解 版权声明:本文为博主原创文章,未经博主允许不得转载. 前几天项目中有用到 Android 通知相关的内容,索性把 Android Notificatio ...

随机推荐

  1. Python全栈开发:django网络框架(一)

    Python的WEB框架有Django.Tornado.Flask 等多种,Django相较与其他WEB框架其优势为:大而全,框架本身集成了ORM.模型绑定.模板引擎.缓存.Session等诸多功能. ...

  2. CF421D Bug in Code

    题意:n个人每人选择了另外不相同的两个人.问有多少对(x,y)使得这n个人中至少有p个选择了至少其中之一? 标程:那就不写了吧. 题解:容斥 统计Ax表示有多少个人选择了x. 一般来说有Ax+Ay&g ...

  3. soj115 御坂网络

    题意:平面上有n个A发射点和m个B发射点,可以选择安置相应A/B装置,装置范围是圆,自取半径(要求都相同且<=Rmax).异种要求范围不相交.求装置范围之和(不是并!). 标程: #includ ...

  4. python3和python2编码拾遗

    py2编码 tr和unicode str和unicode都是basestring的子类.严格意义上说,str其实是字节串,它是unicode经过编码后的字节组成的序列.对UTF-8编码的str'苑'使 ...

  5. Windows 10 连接服务器

    { windows + r    input mstsc } { //mstsc D:\TOOL\Servers.rdp /v 127.0.0.1:9998 }

  6. CSS3——伸缩布局及应用

    CSS3在布局方面做了非常大的改进,使得我们对块级元素的布局排列变得十分灵活,适应性非常强,其强大的伸缩性,在响应式开中可以发挥极大的作用. 主轴:Flex容器的主轴主要用来配置Flex项目,默认是水 ...

  7. hadoop Datanode多目录配置

    1. DataNode也可以配置成多个目录,每个目录存储的数据不一样.即:数据不是副本2.具体配置如下 hdfs-site.xml <property> <name>dfs.d ...

  8. Java之RabbitMQ(一)与SpringBoot整合

    应用场景:异步处理.应用解耦.流量削峰 参照:https://blog.csdn.net/weixin_38364973/article/details/82834348 开端 RabbitAutoC ...

  9. python字符串的索引切片和常用操作方法,for循环

    ---恢复内容开始--- 一.字符串的索引与切片 1.索引 s = 'ASDFGHJKL' 有序序列,索引--index:从0开始 s1 = s[0],取出单个元素:A: s1是个全新的字符串和原字符 ...

  10. USACO training course Number Triangles 数塔 /// DP oj10122

    题目大意: ...就是数塔       7         3   8      8   1   0     2   7   4   4 4   5   2   6   5 7+3+8+7+5=30 ...