青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

隨筆 - 87  文章 - 279  trackbacks - 0
<2006年1月>
25262728293031
1234567
891011121314
15161718192021
22232425262728
2930311234

潛心看書研究!

常用鏈接

留言簿(19)

隨筆分類(81)

文章分類(89)

相冊

ACM OJ

My friends

搜索

  •  

積分與排名

  • 積分 - 220431
  • 排名 - 118

最新評論

閱讀排行榜

評論排行榜

發覺計算機很多東西都是相同的,記得操作系統時候學過這一概率 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 閱讀(572) 評論(0)  編輯 收藏 引用 所屬分類: C++之夢
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            久久久在线视频| 亚洲裸体俱乐部裸体舞表演av| 国产精品久久二区二区| 欧美女人交a| 欧美日韩一二三四五区| 欧美日本三区| 国产精品无码永久免费888| 国产欧美精品一区| 亚洲福利电影| 亚洲天堂成人在线视频| 久久精品日韩欧美| 欧美成人a视频| 亚洲精品色婷婷福利天堂| 亚洲美女在线观看| 欧美伊久线香蕉线新在线| 另类欧美日韩国产在线| 亚洲电影免费观看高清| 久久久久久久久一区二区| 香蕉成人久久| 久久这里只有| 欧美午夜片欧美片在线观看| 国产一区二区三区观看| 亚洲欧洲中文日韩久久av乱码| 一区二区三区黄色| 久久久人成影片一区二区三区观看| 欧美高清视频一区二区三区在线观看 | 免费欧美视频| 一本综合久久| 美女日韩在线中文字幕| 国产精品亚洲视频| 日韩亚洲欧美一区二区三区| 亚洲欧美视频一区二区三区| 蜜桃av一区二区| 91久久夜色精品国产九色| 亚洲无线观看| 欧美国产一区二区在线观看| 欧美日韩国产一区二区三区地区| 国产日韩免费| 亚洲一区二区毛片| 欧美成人一区二区三区片免费| 亚洲一区视频| 欧美日韩在线一区二区| 亚洲激情网站| 欧美在线视频免费| 亚洲小说欧美另类社区| 欧美日本韩国一区二区三区| 国产在线观看精品一区二区三区| 亚洲毛片在线观看.| 男人的天堂成人在线| 亚洲欧美激情视频在线观看一区二区三区| 久久国产精品高清| 国产精品影视天天线| 亚洲在线观看视频| 日韩视频国产视频| 欧美日韩在线不卡| 亚洲免费一级电影| 亚洲私人影院在线观看| 欧美激情一区二区三区高清视频| 一区二区视频免费在线观看| 性欧美暴力猛交69hd| 9色国产精品| 欧美精品一区二区三区蜜桃| 亚洲国产成人在线| 你懂的视频一区二区| 久久久久久久精| 国产女主播一区| 欧美一区二区三区四区高清| 亚洲欧美区自拍先锋| 国产欧美精品在线| 久久中文久久字幕| 亚洲国产高潮在线观看| 久久久精品一品道一区| 欧美影院成年免费版| 国产日韩欧美一区二区三区四区| 午夜免费久久久久| 欧美在线电影| 亚洲精品国产品国语在线app| 最新高清无码专区| 国产精品视频大全| 久久青草欧美一区二区三区| 久久久精品日韩欧美| 亚洲精品久久| 亚洲免费播放| 国产精品视频一二| 久久久久国产精品www| 久久久久久自在自线| 一区二区高清视频| 欧美一站二站| 一本色道久久| 久久xxxx精品视频| 亚洲精品在线免费| 亚洲欧美一级二级三级| 亚洲欧洲在线一区| 亚洲一区二区三区免费观看| 国模一区二区三区| 亚洲国产美女| 国产婷婷一区二区| 91久久精品网| 亚洲少妇自拍| 亚洲国产一区二区在线| 一区二区三区高清在线| 国产亚洲欧美另类中文| 99国产一区| 亚洲国产一区在线观看| 性色一区二区| 亚洲欧美在线看| 欧美日韩少妇| 欧美成人精品一区二区| 国产精品一区二区久久精品| 亚洲成人在线视频播放 | 国产视频在线观看一区 | 久久精品国语| 亚洲在线观看免费视频| 免费成人av在线| 欧美一区亚洲二区| 欧美日韩免费观看一区二区三区 | 一区二区三区高清视频在线观看| 黄色亚洲在线| 午夜精品久久久久久久| 国产精品99久久久久久久女警| 久久一区视频| 麻豆久久婷婷| 黄色亚洲网站| 久久另类ts人妖一区二区| 久久精品国产一区二区三| 欧美人成在线| 欧美a级片网站| 国产欧美日韩免费| 99精品欧美一区二区蜜桃免费| 欧美国产成人精品| 国内久久婷婷综合| 亚洲你懂的在线视频| 亚洲色无码播放| 欧美日韩在线播放三区| 亚洲肉体裸体xxxx137| 亚洲国产精品va在看黑人| 久久久久久九九九九| 在线观看日韩精品| 老色批av在线精品| 欧美成人精品在线播放| 国产欧美日韩91| 欧美在线观看日本一区| 久久精品伊人| 韩日精品视频| 久久一本综合频道| 亚洲欧洲日本在线| 9l国产精品久久久久麻豆| 欧美日韩久久精品| 在线视频中文亚洲| 久久爱www.| 国产在线乱码一区二区三区| 久久精品国产清自在天天线 | 亚洲麻豆一区| 一本一本大道香蕉久在线精品| 蜜桃av一区| 洋洋av久久久久久久一区| 午夜视频在线观看一区二区三区| 国产亚洲欧美日韩在线一区| 欧美一二区视频| 欧美黄色网络| 亚洲欧美日韩区| 国产在线精品一区二区中文| 免费成人在线观看视频| 99精品视频一区二区三区| 欧美在线视频不卡| 91久久精品国产91久久性色tv | 欧美激情小视频| 亚洲免费精彩视频| 久久久国产一区二区| 亚洲福利免费| 国产精品久久一区二区三区| 久久国产精品99精品国产| 亚洲精品视频免费在线观看| 性欧美办公室18xxxxhd| 亚洲欧洲午夜| 国产农村妇女毛片精品久久麻豆| 久久网站免费| 亚洲自啪免费| 亚洲国产精品成人综合| 欧美伊久线香蕉线新在线| 亚洲精品国产精品国自产观看浪潮| 欧美视频你懂的| 免费久久99精品国产自| 亚洲欧美激情一区二区| 亚洲激情网站免费观看| 久久九九免费| 亚洲欧美视频一区二区三区| 亚洲国产精品精华液2区45| 国产日本欧美一区二区三区| 欧美精品18+| 久久视频精品在线| 欧美一区二区三区日韩视频| 亚洲精品黄色| 欧美v日韩v国产v| 久久久亚洲影院你懂的| 午夜视频一区| 亚洲欧美日韩综合国产aⅴ| 欧美精品一区二区三区在线播放| 欧美久久在线| 久久中文精品|