免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4758 | 回复: 8
打印 上一主题 下一主题

boost的shared_ptr源码问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-08-28 14:08 |只看该作者 |倒序浏览
下面的代码是boost库里的shared_ptr的定义,它的拷贝构造函数和swap()
shared_ptr(shared_ptr const & r): px(r.px)  // never throws

    {

        pn = r.pn;

        ++*pn;

    }

void swap(shared_ptr<T> & other)  // never throws

    {

        std::swap(px, other.px);

        std::swap(pn, other.pn);

    }

为什么这里是直接引用的私有的成员变量px,pn?这样能通过编译吗?还是有其他的trick在里面?

//摘自boost_1_36_0/boost/detail/shared_ptr_nmt.hpp
template<class T> class shared_ptr

{

private:



    typedef detail::atomic_count count_type;



public:



    typedef T element_type;

    typedef T value_type;



    explicit shared_ptr(T * p = 0): px(p)

    {

#ifndef BOOST_NO_EXCEPTIONS



        try  // prevent leak if new throws

        {

            pn = new count_type(1);

        }

        catch(...)

        {

            boost::checked_delete(p);

            throw;

        }



#else



        pn = new count_type(1);



        if(pn == 0)

        {

            boost::checked_delete(p);

            boost::throw_exception(std::bad_alloc());

        }



#endif

    }



    ~shared_ptr()

    {

        if(--*pn == 0)

        {

            boost::checked_delete(px);

            delete pn;

        }

    }



    shared_ptr(shared_ptr const & r): px(r.px)  // never throws

    {

        pn = r.pn;

        ++*pn;

    }



    shared_ptr & operator=(shared_ptr const & r)

    {

        shared_ptr(r).swap(*this);

        return *this;

    }



#ifndef BOOST_NO_AUTO_PTR



    explicit shared_ptr(std::auto_ptr<T> & r)

    {

        pn = new count_type(1); // may throw

        px = r.release(); // fix: moved here to stop leak if new throws

    }



    shared_ptr & operator=(std::auto_ptr<T> & r)

    {

        shared_ptr(r).swap(*this);

        return *this;

    }



#endif



    void reset(T * p = 0)

    {

        BOOST_ASSERT(p == 0 || p != px);

        shared_ptr(p).swap(*this);

    }



    T & operator*() const  // never throws

    {

        BOOST_ASSERT(px != 0);

        return *px;

    }



    T * operator->() const  // never throws

    {

        BOOST_ASSERT(px != 0);

        return px;

    }



    T * get() const  // never throws

    {

        return px;

    }



    long use_count() const  // never throws

    {

        return *pn;

    }



    bool unique() const  // never throws

    {

        return *pn == 1;

    }

   

    void swap(shared_ptr<T> & other)  // never throws

    {

        std::swap(px, other.px);

        std::swap(pn, other.pn);

    }



private:



    T * px;            // contained pointer

    count_type * pn;   // ptr to reference counter

};

[ 本帖最后由 jazy333 于 2008-8-28 14:15 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2008-08-28 14:22 |只看该作者
好像class一样,是可以访问到同样class的不同实例的private的:

  1. #include <cstdio>



  2. class test
  3. {
  4. public:
  5.         static void test_private( )
  6.         {
  7.                 test obj;
  8.                 obj.print( );
  9.         }
  10. private:
  11.         void print( )
  12.         {
  13.                 printf( "Hello\n" );
  14.         }

  15. };


  16. int main( )
  17. {
  18.         test::test_private( );
  19.         return 0;
  20. }
复制代码

论坛徽章:
0
3 [报告]
发表于 2008-08-28 14:28 |只看该作者
原帖由 飞灰橙 于 2008-8-28 14:22 发表
好像class一样,是可以访问到同样class的不同实例的private的:

#include



class test
{
public:
        static void test_private( )
        {
                test obj;
                 ...

怎么没听说过!

论坛徽章:
0
4 [报告]
发表于 2008-08-28 14:30 |只看该作者
原帖由 jazy333 于 2008-8-28 14:28 发表

怎么没听说过!


我也没听说过,以前写重载 operator 碰到这个问题,就想当然这么认为了。

论坛徽章:
0
5 [报告]
发表于 2008-08-28 14:33 |只看该作者
原帖由 jazy333 于 2008-8-27 22:08 发表
下面的代码是boost库里的shared_ptr的定义,它的拷贝构造函数和swap()
shared_ptr(shared_ptr const & r): px(r.px)  // never throws

    {

        pn = r.pn;

        ++*pn;

    }

void sw ...


上面的swap是shared_ptr的成员函数,为什么不能访问该类对象的私有成员?

论坛徽章:
0
6 [报告]
发表于 2008-08-28 14:41 |只看该作者
原帖由 emacsnw 于 2008-8-28 14:33 发表


上面的swap是shared_ptr的成员函数,为什么不能访问该类对象的私有成员?

void swap(shared_ptr<T> & other)  // never throws

    {

        std::swap(px, other.px);

        std::swap(pn, other.pn);

    }
参数other!

论坛徽章:
0
7 [报告]
发表于 2008-08-28 14:49 |只看该作者
原帖由 jazy333 于 2008-8-27 22:41 发表

void swap(shared_ptr & other)  // never throws

    {

        std::swap(px, other.px);

        std::swap(pn, other.pn);

    }
参数other!


我知道,结论就是我上贴说的,请参阅C++语法书。。。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
8 [报告]
发表于 2008-08-28 15:01 |只看该作者
就好像重载 赋值运算符一样.. 这是C++语法 问题. 具体是个什么语法? 我还真没注意过.

论坛徽章:
0
9 [报告]
发表于 2008-08-28 17:24 |只看该作者
原帖由 emacsnw 于 2008-8-28 14:49 发表


我知道,结论就是我上贴说的,请参阅C++语法书。。。


同意。swap是成员函数,当然可以访问private。【尽管看起来other是外部来的变量】

看个例子

#include <iostream>
using namespace std;


class Item
{
public:
        Item(int i)
        {
                x=i;
        }
       void AddOne(const Item& it){
                x+=it.x;
        }
        int GetX()
        {
                return x;
        }
private:
        int x;
};

int main()
{
        Item it1(1),it2(2);
        it1.AddOne(it2);
        printf("%d\n",it1.GetX());
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP