• <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>
            隨筆 - 87  文章 - 279  trackbacks - 0
            <2025年5月>
            27282930123
            45678910
            11121314151617
            18192021222324
            25262728293031
            1234567

            潛心看書研究!

            常用鏈接

            留言簿(19)

            隨筆分類(81)

            文章分類(89)

            相冊

            ACM OJ

            My friends

            搜索

            •  

            積分與排名

            • 積分 - 216670
            • 排名 - 117

            最新評論

            閱讀排行榜

            評論排行榜

            發覺計算機很多東西都是相同的,記得操作系統時候學過這一概率 copy on write,在Reference Counted中徹底用到,代碼的設計確實精妙,可以在不修改客戶端得類,利用RCIPtr間接指針,對客戶端的類實現引用計數,太妙了,詳細見代碼吧,代碼中Widget為已有的客戶端的類,RCIPtr是一個間接指針,RCObject是引用計數的基類,所有需要引用計數的類都必須繼承他,換句話說,RCObject類將引用計數邏輯封裝了,而RCIPtr則是連接客戶端類的紐帶.
            代碼如下:
            RCIPtr.h
            #ifndef RCIPTR_H
            #define RCIPTR_H

            #include 
            "RCObject.h"

            template
            <class T>
            class RCIPtr {
            public :
                RCIPtr(T
            * realPtr = 0);                        
                RCIPtr(
            const RCIPtr& rhs);
                
            ~RCIPtr();
                RCIPtr
            & operator=(const RCIPtr& rhs);
                
            const T* operator->() const;                    //const version ->
                T* operator->();                                
                
            const T& operator*() const;                    //const version *
                T& operator*();
                
            int getRefCount() const;                    //測試用,獲取指針所指向的對象的引用數
            private :
                
            struct CountHolder : public RCObject {                //T的實際的指針保寸的地方
                    ~CountHolder() {delete pointee;};
                    T
            * pointee;
                }
            ;
                CountHolder 
            *counter;
                
            void init();                            //初始化公共代碼
                void makeCopy();                        //Copy On Write的調用函數
            }
            ;

            #include 
            "RCIPtr.cpp"

            #endif

            RCIPtr.cpp
            #ifdef RCIPTR_H 

            template
            <class T> 
            void RCIPtr<T>::init() {
                
            if (counter->isShareable() == false{
                    T
            * oldValue = counter->pointee;
                    counter 
            = new CountHolder;
                    counter
            ->pointee = new T(*oldValue);
                }

                counter
            ->addReference();
            }


            template
            <class T>                                 
            void RCIPtr<T>::makeCopy() {
                
            if (counter->isShared()) {
                    counter
            ->removeReference();
                    T
            * oldValue = counter->pointee;    
                    counter 
            = new CountHolder;
                    counter
            ->pointee = new T(*oldValue);
                    counter
            ->addReference();
                }

            }


            template
            <class T> 
            RCIPtr
            <T>::RCIPtr(T* realPtr) : counter(new CountHolder) {
                counter
            ->pointee = realPtr;
                init();
            }


            template
            <class T> 
            RCIPtr
            <T>::RCIPtr(const RCIPtr& rhs) : counter(rhs.counter) {
                init();
            }


            template
            <class T> 
            RCIPtr
            <T>::~RCIPtr() {
                counter
            ->removeReference();
            }


            template
            <class T> 
            RCIPtr
            <T>& RCIPtr<T>::operator=(const RCIPtr& rhs) {
                
            if (counter != rhs.counter) {
                    counter
            ->removeReference();
                    counter 
            = rhs.counter;
                    init();
                }

                
            return *this;
            }


            template
            <class T> 
            const T* RCIPtr<T>::operator->() const {
                
            return counter->pointee;
            }
                        

            template
            <class T> 
            T
            * RCIPtr<T>::operator->() {
                makeCopy(); 
                
            return counter->pointee;
            }


            template
            <class T>                                 
            const T& RCIPtr<T>::operator*() const {
                
            return *(counter->pointee);
            }



            template
            <class T>                                 
            T
            & RCIPtr<T>::operator*() {
                makeCopy();
                
            return *(counter->pointee);
            }


            template
            <class T>
            int RCIPtr<T>::getRefCount() const {
                
            return counter->getRefCount();
            }


            #endif

            RCObject.h
            #ifndef RCOBJECT_H
            #define RCOBJECT_H

            /**
             *    base class, 用于reference-counted objects
             
            */

            class RCObject {
            public :
                
            void addReference();                        //添加reference
                void removeReference();                        //刪除reference
                void markUnshareable();                        //標記object不可共享
                bool isShareable() const;                    //判斷object是否可被共享
                bool isShared() const;                        //判斷object是否被共享中
                int getRefCount() const;                    //獲取對象的引用數
            protected :
                RCObject();                                    
            //RCObject default-constructor
                RCObject(const RCObject& rhs);                //RCObject copy-constructor 
                RCObject& operator=(const RCObject& rhs);    //RCObject assignment
                virtual ~RCObject() = 0;
            private :
                
            int refCount;                                //引用計數
                bool shareable;                                //可否共享標記
            }
            ;

            #endif

            RCObject.cpp
            #include "RCObject.h"

            RCObject::RCObject() : refCount(
            0), shareable(true{
            }


            RCObject::RCObject(
            const RCObject& rhs) : refCount(0), shareable(true{
            }


            RCObject
            & RCObject::operator =(const RCObject& rhs) {
                
            return *this;
            }


            void RCObject::addReference() {
                refCount
            ++;
            }


            void RCObject::removeReference() {
                
            if (--refCount == 0) delete this;
            }


            void RCObject::markUnshareable() {
                shareable 
            = false;
            }


            bool RCObject::isShareable() const {
                
            return shareable;
            }


            bool RCObject::isShared() const {
                
            return refCount > 1;
            }


            int RCObject::getRefCount() const {
                
            return refCount;
            }


            RCObject::
            ~RCObject() {
            //    delete this;
            }

            Widget.h
            #ifndef WIDGET_H
            #define WIDGET_H

            /**
             * Widget測試類
             
            */

            class Widget {
            public :
                Widget(
            int size);
                Widget(
            const Widget& rhs);
                
            ~Widget();
                Widget
            & operator=(const Widget& rhs);
                
            void setSize(int size);
                
            int getSize() const;
                
            void showSize() const;
            private :
                
            int mSize;
            }
            ;

            #endif

            Widget.cpp
            #include "Widget.h"
            #include 
            <iostream>
            using namespace std;


            Widget::Widget(
            int size) : mSize(size) {
            }


            Widget::Widget(
            const Widget& rhs) : mSize(rhs.mSize) {
            }


            Widget::
            ~Widget() {
            }


            Widget
            & Widget::operator=(const Widget& rhs) {
                
            if (this == &rhs) {
                    
            return *this;
                }

                mSize 
            = rhs.getSize();
                
            return *this;
            }


            void Widget::setSize(int size) {
                mSize 
            = size;
            }


            int Widget::getSize() const {
                
            return mSize;
            }


            void Widget::showSize() const {
                cout 
            << "Size of this Widget is " << mSize << endl;
            }

            RCWidget.h
            #ifndef RCWIDGET_H
            #define RCWIDGET_H

            #include 
            "RCIPtr.h"
            #include 
            "Widget.h"

            class RCWidget {
            public :
                RCWidget(
            int size);
                
            void setSize(int size);
                
            int getSize() const;
                
            void showSize() const;
                
            int getRefCount() const;
            private :
                RCIPtr
            <Widget> value;
            }
            ;

            #endif 

            RCWidget.cpp
            #include "RCWidget.h"

            RCWidget::RCWidget(
            int size) : value(new Widget(size)) {
            }


            void RCWidget::setSize(int size) {
                value
            ->setSize(size);
            }


            int RCWidget::getSize() const {
                
            return value->getSize();
            }


            void RCWidget::showSize() const {
                value
            ->showSize();
            }


            int RCWidget::getRefCount() const {
                
            return value.getRefCount();
            }

            test.cpp
            #include "RCWidget.h"
            #include 
            <iostream>
            using namespace std;

            int main() {
                RCWidget w(
            100);
                RCWidget v(w);
                v.showSize();
                w.showSize();
                cout 
            << "v RCWidget RefCount is " << v.getRefCount() << endl;
                cout 
            << "w RCWidget RefCount is " << w.getRefCount() << endl;
                v.setSize(
            20);
                v.showSize();
                w.showSize();
                cout 
            << "v RCWidget RefCount is " << v.getRefCount() << endl;
                cout 
            << "w RCWidget RefCount is " << w.getRefCount() << endl;
                
            return 0;
            }


            Result :
            Size of this Widget is 100
            Size of this Widget is 100
            v RCWidget RefCount is 2
            w RCWidget RefCount is 2
            Size of this Widget is 20
            Size of this Widget is 100
            v RCWidget RefCount is 1
            w RCWidget RefCount is 1
            Press any key to continue

             只要每次寫一個類似的RC類,就不用修改客戶端已有的類,而又可以實現Reference-Counting了

            posted on 2008-04-09 21:36 閱讀(550) 評論(0)  編輯 收藏 引用 所屬分類: C++之夢
            爱做久久久久久| 国产精品久久久久jk制服| 一级做a爰片久久毛片16| 人妻精品久久无码区 | 久久精品国产亚洲AV无码娇色| 亚洲国产一成久久精品国产成人综合| 国产99久久久国产精免费| 91精品无码久久久久久五月天| 青青草国产成人久久91网| 国产L精品国产亚洲区久久| 精品久久久久久国产牛牛app | 久久影视综合亚洲| 久久精品国产精品亚洲人人| 久久成人精品| 久久AV高潮AV无码AV| 伊人久久综合精品无码AV专区| 久久亚洲AV成人无码电影| 麻豆精品久久精品色综合| 欧美亚洲日本久久精品| 久久精品日日躁夜夜躁欧美| 久久久精品2019免费观看| 色综合色天天久久婷婷基地| 看全色黄大色大片免费久久久| 欧美亚洲国产精品久久高清| 久久久无码一区二区三区| 亚洲国产精久久久久久久| 一本一道久久a久久精品综合| 久久精品中文无码资源站| 一本久久a久久精品综合夜夜| 久久这里只精品99re66| 精品免费tv久久久久久久| 久久无码国产| 97久久天天综合色天天综合色hd | 热99re久久国超精品首页| 伊人热热久久原色播放www| 国产一区二区三区久久| 久久精品国产2020| 久久影视国产亚洲| 国产成人久久久精品二区三区| 一本色道久久HEZYO无码| 一本久久久久久久|