详解osg::ref_ptr
首先,要使用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的更多相关文章
- [原][osg]Geometry详解
//geometry成员变量 PrimitiveSetList _primitives; osg::ref_ptr<Array> _vertexArray; //顶点 osg::ref_p ...
- Qt开发技术:QCharts(三)QCharts样条曲线图介绍、Demo以及代码详解
若该文为原创文章,未经允许不得转载原博主博客地址:https://blog.csdn.net/qq21497936原博主博客导航:https://blog.csdn.net/qq21497936/ar ...
- FFmpeg开发笔记(五):ffmpeg解码的基本流程详解(ffmpeg3新解码api)
若该文为原创文章,未经允许不得转载原博主博客地址:https://blog.csdn.net/qq21497936原博主博客导航:https://blog.csdn.net/qq21497936/ar ...
- Linq之旅:Linq入门详解(Linq to Objects)
示例代码下载:Linq之旅:Linq入门详解(Linq to Objects) 本博文详细介绍 .NET 3.5 中引入的重要功能:Language Integrated Query(LINQ,语言集 ...
- 架构设计:远程调用服务架构设计及zookeeper技术详解(下篇)
一.下篇开头的废话 终于开写下篇了,这也是我写远程调用框架的第三篇文章,前两篇都被博客园作为[编辑推荐]的文章,很兴奋哦,嘿嘿~~~~,本人是个很臭美的人,一定得要截图为证: 今天是2014年的第一天 ...
- EntityFramework Core 1.1 Add、Attach、Update、Remove方法如何高效使用详解
前言 我比较喜欢安静,大概和我喜欢研究和琢磨技术原因相关吧,刚好到了元旦节,这几天可以好好学习下EF Core,同时在项目当中用到EF Core,借此机会给予比较深入的理解,这里我们只讲解和EF 6. ...
- Java 字符串格式化详解
Java 字符串格式化详解 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 文中如有纰漏,欢迎大家留言指出. 在 Java 的 String 类中,可以使用 format() 方法 ...
- Android Notification 详解(一)——基本操作
Android Notification 详解(一)--基本操作 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/Notification 文中如有纰 ...
- Android Notification 详解——基本操作
Android Notification 详解 版权声明:本文为博主原创文章,未经博主允许不得转载. 前几天项目中有用到 Android 通知相关的内容,索性把 Android Notificatio ...
随机推荐
- 【学术篇】SPOJ QTREE 树链剖分
发现链剖这东西好久不写想一遍写对是有难度的.. 果然是熟能生巧吧.. WC的dalao们都回来了 然后就用WC的毒瘤题荼毒了我们一波, 本来想打个T1 44分暴力 然后好像是特判写挂了还是怎么的就只能 ...
- Windows系统查看xxx.dll、xxx.lib文件的导出函数、依赖文件等信息的方法
1.查看xxx.dll或xxx.exe文件的导出函数.依赖文件等信息,使用Depends软件即可. 2.查看xxx.lib文件的导出函数.依赖文件等信息,使用Visual Studio附带工具dump ...
- Jquery操作的是内存数据,H5 dataset操作的是dom属性
Jquery操作的是内存数据,H5操作的是dom属性
- vue v-model :
v-model : 通过v-model 进行双向绑定 ,将data的数据与input 绑定在一起,呈现在页面上 <!DOCTYPE html> <html lang="en ...
- Monkey 稳定性测试
学习网址: https://blog.csdn.net/lucytan01/article/details/79958727 https://blog.csdn.net/hebbely/article ...
- CSS压缩
通过W3C 统一验证工具的检测没有错误后,为了提高加载速度和节约空间(相对来说,css量很少的情况下,几乎没啥区别),可以通过css压缩工具把css进行压缩. w3c css压缩 http://too ...
- day33 序列类型,绑定方法,类方法,静态方法,封装继承和多态
Python之路,Day20 = 序列类型,绑定方法,类方法,静态方法,封装继承和多态 序列是指有序的队列,重点在"有序". 一.Python中序列的分类 Python中的序列主要 ...
- day18 函数定义、参数;名称空间;全局变量及局部变量。
Python之路,Day6 = Python基础6 函数的定义 def func1(): # 定义一个函数,名字叫func1,括号中没有传入参数 print('hello word') # 这里是 f ...
- golang中time包一个简单的时间格式输出
一.代码 package main import ( "fmt" "time" ) func main() { //"2006-01-02 15:04 ...
- (一)PHP基础知识考察点
1,PHP引用变量的考察点: 概念:引用就是用不同的名字访问同一个变量内容. 定义方式: 使用&符号. PHP引用变量的工作原理 这里有个COW copy on write 用zval() ...