文档章节

Boost shared_from_this用法

吃一堑消化不良
 吃一堑消化不良
发布于 2016/11/04 11:31
字数 265
阅读 272
收藏 0
#include <boost/enable_shared_from_this.hpp> 

该头文件定义了一个类模板enable_shared_from_this。它是一个基类,允许继承该类的对象的成员函数在其内部获取share_ptr指针。

下面是源码分析:

从enable_shared_from_this派生的继承了下面的成员

mutable weak_ptr<T> weak_this_;

获取当前对象的shared_ptr指针就是从该weak_ptr提升而来

shared_ptr<T> shared_from_this()
{
    shared_ptr<T> p( weak_this_ );
    BOOST_ASSERT( p.get() == this );
    return p;
}

而weak_ptr的则是在构造的时候初始化的

explicit shared_ptr( Y * p ): px( p ), pn( p ) // Y must be complete
{
    boost::detail::sp_enable_shared_from_this( this, p, p );
}
    
template< class X, class Y, class T >
inline void sp_enable_shared_from_this( boost::shared_ptr<X> const * ppx, Y const * py, 
boost::enable_shared_from_this< T > const * pe )
{
    if( pe != 0 )
    {
        pe->_internal_accept_owner( ppx, const_cast< Y* >( py ) );
    } 
}

template<class X, class Y> 
void _internal_accept_owner( shared_ptr<X> const * ppx, Y * py ) const
{
    if( weak_this_.expired() )
    {
        weak_this_ = shared_ptr<T>( *ppx, py );
    }
}

boost::enable_shared_from_this的正确使用方法如下:

class Y: public boost::enable_shared_from_this<Y>
{
public:

    boost::shared_ptr<Y> f()
    {
        return shared_from_this();
    }
};

...

// 正确的使用方法
boost::shared_ptr<Y> p(new Y);
boost::shared_ptr<Y> q = p->f();

// 错误的使用方法,因为Y的成员weak_ptr 根本就没有得到初始化
Y  yy;
boost::shared_ptr<Y> q = yy.f();

 

© 著作权归作者所有

吃一堑消化不良
粉丝 28
博文 188
码字总数 113563
作品 0
浦东
程序员
私信 提问
boost async_read_some 用法

asyncreadsome读到数据就会直接回调设置的函数,不管数据是否已经读完。所以在这里 会遇到一个非常棘手的问题,如何确定数据已经读取完毕?常见的方式是在数据的后面添加 标志位,例如添加/...

技术小胖子
2017/11/09
0
0
C++ boost 自己的经验

C++ boost 下载 zip 包 解压 D:boost169 cd D:boost169 的解压目录 然后 执行批处理 bootstrap.bat 等一会 会生成 b2.exe 和 bjam.exe (他们只是版本不同的产物,但是用法一致,bjam是之前版...

shzwork
02/14
16
0
(六)boost库之内存管理shared_ptr

1、sharedptr的基本用法 boost::sharedptr<int> sp(new int(10)); //一个指向整数的shared_ptr assert(sp.unique()); //现在shared_ptr是指针的唯一持有者 boost::sharedptr<int> sp2 = sp; ......

fanzhao
2014/03/25
3.4K
0
windows下mingw编译boost

Mingw编译Boost库 一、Boost Boost库是一个可移植、提供源代码的C++库,作为标准库的后备,是C++标准化进程的发动机之一。其官方网站为http://www.boost.org/,目前最新版本为1.49.0,以下以...

viwii
2012/04/24
971
0
N叉树一 基本实现

丢了一次以前写的算法的文档和源代码,Ubuntu One不可靠啊!只好从头再写一遍。 本文实现了一个树,不是二叉树,是N叉树。也就是允许一个节点拥有多个子节点。 不是为了做题目糊弄人,所以内...

长平狐
2012/08/28
373
0

没有更多内容

加载失败,请刷新页面

加载更多

安全组和云防火墙的区别

前言 熟悉云平台的朋友可能都会注意到这样一个事情:无论公有云还是私有云,创建虚拟机的时候都需要选择安全组,来对虚拟机进行安全防护;有的云平台在VPC里,还能选择防火墙,ZStack在3.6版...

ZStack社区版
25分钟前
2
0
教育性app开发的重要性和好处

在这个精通技术的世界中,流行的app主导着无聊的教育系统。当我们将技术和教育结合在一起时,它将带来当代以及强大的学习资源。因此,将教育移动app集成到您的学习过程中,并根据自己的信念把...

a429011717
26分钟前
3
0
IE6/7/8如何兼容CSS3属性

本文转载于:专业的前端网站➩IE6/7/8如何兼容CSS3属性 最近在工作中总是要求IE8兼容CSS3属性,在网上搜了搜主要是引入了一个htc文件(ie-css3.htc或者PIE.htc。个人认为这两个文件的作用差不...

前端老手
41分钟前
3
0
手把手教你ALLEGRO的约束规则的设置教程!

约束规则的设置 分三步, 定义规则(一、基本约束规则设置:1、线间距设置;2、线宽设置;3、设置过孔;4、区域约束规则设置;5、设置阻抗;6、设置走线的长度范围;7、设置等长:7.1、不过电阻的NET 等...

demyar
43分钟前
4
0
完美解决H5滚动滑动穿透方案:不使用系统滚动

网上有很多黑科技解决这个问题,都不是从根本去解决,例如通过js控制弹出时html加上position:fixed; 弹窗关闭后再去掉该样式,总觉得不太对,像是打补丁。 今天终于找到了滚动穿透的原因和完...

未来cc
47分钟前
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部