• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

               C++ 技術(shù)中心

               :: 首頁 :: 聯(lián)系 ::  :: 管理
              160 Posts :: 0 Stories :: 87 Comments :: 0 Trackbacks

            公告

            鄭重聲明:本BLOG所發(fā)表的原創(chuàng)文章,作者保留一切權(quán)利。必須經(jīng)過作者本人同意后方可轉(zhuǎn)載,并注名作者(天空)和出處(CppBlog.com)。作者Email:coder@luckcoder.com

            留言簿(27)

            搜索

            •  

            最新隨筆

            最新評論

            評論排行榜

            使用enable_shared_from_this

            說明
            The header <boost/enable_shared_from_this.hpp> defines the class template enable_shared_from_this. It is used as a base class that allows a shared_ptr to the current object to be obtained from within a member function.
            繼承該類就可以進(jìn)行基于當(dāng)前子類進(jìn)行安全的weap_ptr到shared_ptr的轉(zhuǎn)換...

            代碼實例
            以下代碼中Y類繼承enable_shared_from_this,, 從而我們可以直接在函數(shù)中調(diào)用shared_from_this獲得該對象的shared_ptr

            class Y: public enable_shared_from_this<Y>
            {
            public:

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

            int main()
            {
                shared_ptr<Y> p(new Y);
            // 調(diào)用f獲得shared_ptr

                shared_ptr<Y> q = p->f();
                assert(p == q);
                assert(!(p < q || q < p)); // p and q must share ownership

            }


            該類的實現(xiàn)


            template<class T> class enable_shared_from_this
            {
            protected:

                enable_shared_from_this()
                {
                }

                enable_shared_from_this(enable_shared_from_this const &)
                {
                }

                enable_shared_from_this & operator=(enable_shared_from_this const &)
                {
                    return *this;
                }

                ~enable_shared_from_this()
                {
                }

            public:

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

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

            // Note: No, you don't need to initialize _internal_weak_this

            //

            // Please read the documentation, not the code

            //

            // http://www.boost.org/libs/smart_ptr/enable_shared_from_this.html


                typedef T _internal_element_type; // for bcc 5.5.1

                mutable weak_ptr<_internal_element_type> _internal_weak_this;
            };


            結(jié)論

            這個實用類提供了簡單的shared_ptr轉(zhuǎn)換和安全的weak式驗證... 這樣通過繼承就可以使用shared_from_this進(jìn)行安全當(dāng)前類weak_ptr到shared_ptr的轉(zhuǎn)換...

            enable_from_this方法的使用與陷阱
            enable_from_this 的使用與實現(xiàn)原理說明:
            shared_from_this()是enable_shared_from_this的成員函數(shù),返回shared_ptr;
            注意的是,這個函數(shù)僅在shared_ptr的構(gòu)造函數(shù)被調(diào)用之后才能使用。
            原因是enable_shared_from_this::weak_ptr并不在構(gòu)造函數(shù)中設(shè)置,而是在shared_ptr的構(gòu)造函數(shù)中設(shè)置。
            錯誤的使用代碼一:

            #include <boost/shared_ptr.hpp>
            #include <boost/enable_shared_from_this.hpp>

            #include <iostream>
            using namespace std;

            class D: public boost::enable_shared_from_this<D>
            {
            public:
                D()
                {
                    cout<<"D::D()"<<endl;
                    boost::shared_ptr<D> p = shared_from_this();
                }    
            };

            int main()
            {
                boost::shared_ptr<D> a(new D);
                return 0;    
            }


            程序編譯通過,執(zhí)行結(jié)果如下:
            D::D()
            terminate called after throwing an instance of 'boost::exception_detail::clone_impl >'
              what():  tr1::bad_weak_ptr
            Aborted
            說明在D的構(gòu)造函數(shù)中調(diào)用shared_from_this(), 此時D的實例本身尚未構(gòu)造成功,weak_ptr也就尚未設(shè)置,所以程序拋出tr1::bad_weak_ptr異常。
            錯誤的使用代碼二:

            #include <boost/shared_ptr.hpp>
            #include <boost/enable_shared_from_this.hpp>

            #include <iostream>
            using namespace std;

            class D: public boost::enable_shared_from_this<D>
            {
            public:
                D()
                {
                    cout<<"D::D()"<<endl;
                }
                
                void func()
                {
                    cout<<"D::func()"<<endl;
                    boost::shared_ptr<D> p = shared_from_this();
                }    
            };

            int main()
            {
                D d;
                d.func();
                return 0;    
            }


            程序編譯通過,執(zhí)行結(jié)果如下:
            D::D()
            D::func()
            terminate called after throwing an instance of 'boost::exception_detail::clone_impl >'
              what():  tr1::bad_weak_ptr
            Aborted
            失敗原因分析:
            在主函數(shù)main中,D的實例是在棧上構(gòu)造,沒有使用boost::shared_ptr 的構(gòu)造方式,
            所以boost::enable_shared_from_this中的weak_ptr所指的函數(shù)對象也就沒有被賦值,
            在調(diào)用d.func()中使用shared_from_this()函數(shù)時
            ----注:shared_from_this的函數(shù)實現(xiàn) ------
                shared_ptr shared_from_this()
                {
                    shared_ptr p( weak_this_ );
                    BOOST_ASSERT( p.get() == this );
                    return p;
                }
            ----注:shared_from_this的函數(shù)實現(xiàn) ------
            調(diào)用BOOST_ASSERT( p.get() == this );  失敗,拋出以上異常。
            最后,我們給出share_from_this()的正確使用例子:

            #include <boost/shared_ptr.hpp>
            #include <boost/enable_shared_from_this.hpp>

            #include <iostream>
            using namespace std;

            class D: public boost::enable_shared_from_this<D>
            {
            public:
                D()
                {
                    cout<<"D::D()"<<endl;
                }
                
                void func()
                {
                    cout<<"D::func()"<<endl;
                    boost::shared_ptr<D> p = shared_from_this();
                }    
            };

            int main()
            {
                boost::shared_ptr<D> p(new D);
                p->func();
                return 0;    
            }    


            執(zhí)行結(jié)果:
            D::D()
            D::func()

            posted on 2017-03-07 14:17 C++技術(shù)中心 閱讀(1279) 評論(0)  編輯 收藏 引用 所屬分類: C++ 基礎(chǔ)
            日韩人妻无码精品久久免费一| 久久精品亚洲AV久久久无码| 亚洲狠狠综合久久| 国产精品成人久久久久三级午夜电影| 久久99精品久久久久久野外 | 久久国产亚洲精品无码| 日韩欧美亚洲综合久久影院d3| 欧美精品丝袜久久久中文字幕| 人妻无码αv中文字幕久久琪琪布 人妻无码久久一区二区三区免费 人妻无码中文久久久久专区 | 欧美久久综合性欧美| 亚洲精品国精品久久99热| 亚洲αv久久久噜噜噜噜噜| 麻豆精品久久精品色综合| 久久香综合精品久久伊人| 99久久无码一区人妻| 久久精品无码一区二区无码 | 久久久久久精品久久久久| 久久国产影院| 伊人丁香狠狠色综合久久| 国产产无码乱码精品久久鸭| 2021国内久久精品| 久久最新免费视频| 久久久久18| 国产女人aaa级久久久级| 国产精品美女久久久m| 狼狼综合久久久久综合网| 久久亚洲AV无码精品色午夜| 久久亚洲精品国产亚洲老地址| 韩国三级中文字幕hd久久精品 | 亚洲人成无码www久久久| 久久精品免费一区二区三区| 精品国产一区二区三区久久久狼 | 久久国产精品77777| 无码人妻久久一区二区三区| 一本一本久久a久久综合精品蜜桃 一本一道久久综合狠狠老 | 精品综合久久久久久88小说| 亚洲一区二区三区日本久久九| 99精品久久久久久久婷婷| 精品久久久久久无码中文字幕| 久久AⅤ人妻少妇嫩草影院| 99久久精品九九亚洲精品|