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

隨筆 - 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>
            美女网站久久| 欧美成人黑人xx视频免费观看| 亚洲精品国偷自产在线99热| 国产精品欧美日韩久久| 欧美激情精品久久久六区热门| 噜噜噜躁狠狠躁狠狠精品视频 | 另类天堂av| 久久久免费av| 欧美精品乱人伦久久久久久| 老司机免费视频久久| 欧美电影在线观看完整版| 久久先锋资源| 欧美另类变人与禽xxxxx| 欧美日韩少妇| 精品盗摄一区二区三区| 亚洲国产精品电影| 亚洲精品日本| 久久电影一区| 亚洲激情影视| 一区二区三区日韩| 中文高清一区| 欧美成人小视频| 国产日本欧美视频| 中国成人亚色综合网站| 免费av成人在线| 亚洲欧美日韩在线综合| 男女激情久久| 国产一区二区三区网站| 亚洲美洲欧洲综合国产一区| 欧美精品v国产精品v日韩精品 | 亚洲国产精品一区| 亚洲欧美第一页| 欧美日韩在线看| 99热免费精品| 亚洲日本免费电影| 欧美精品www| 99re8这里有精品热视频免费| 性欧美1819性猛交| 99pao成人国产永久免费视频| 久久久精品国产一区二区三区| 国产亚洲一区二区三区在线观看| 99ri日韩精品视频| 99成人免费视频| 欧美日韩精品国产| 亚洲一区二区三区免费在线观看 | 亚洲精品一区二区三区四区高清| 久久亚洲国产精品日日av夜夜| 亚洲一区在线播放| 国产美女精品| 久久蜜桃精品| 欧美激情一区二区三级高清视频| 一区二区三区精品视频在线观看| 亚洲免费播放| 国产一区二区欧美| 欧美r片在线| 国产精品hd| 老司机亚洲精品| 欧美日韩在线直播| 久久久久九九九九| 欧美区在线观看| 久久精品一区二区三区四区| 免费不卡视频| 正在播放日韩| 免费一区视频| 久久精品视频在线观看| 欧美成人在线网站| 欧美一区二区三区在线观看视频 | 亚洲另类自拍| 伊人久久大香线蕉综合热线 | 久久久久久久一区二区| 99热精品在线观看| 欧美国产一区视频在线观看| 久久久国际精品| 国产精品日韩在线| 亚洲视频1区2区| 一区二区欧美国产| 欧美视频在线观看免费网址| 亚洲国产欧美一区二区三区久久 | 日韩视频免费在线| 久久久久久网| 欧美大色视频| 99精品久久久| 国产精品一区亚洲| 久久精品国产成人| 欧美黄色成人网| 在线亚洲精品| 国产精品美女www爽爽爽视频| 亚洲天堂免费观看| 欧美一级电影久久| 精品白丝av| 欧美精品日韩综合在线| 亚洲少妇自拍| 国产一区二区三区在线观看免费视频| 午夜精品美女自拍福到在线 | 久久婷婷成人综合色| 国内自拍一区| 欧美日韩日日骚| 久久一区亚洲| 亚洲夜间福利| 91久久午夜| 久久夜色精品国产欧美乱极品 | 久久久夜色精品亚洲| 99爱精品视频| 亚洲成人在线视频播放| 亚洲精品一区二区三| 国产欧美精品一区aⅴ影院| 老司机午夜精品| 亚洲一区二区毛片| 亚洲毛片在线| 亚洲啪啪91| 欧美国产精品va在线观看| 久久精品男女| 久久成人这里只有精品| 欧美一区免费| 欧美在线视频不卡| 欧美在线视频二区| 久久国产精品黑丝| 亚洲欧美综合网| 欧美一进一出视频| 欧美一级专区免费大片| 欧美在线关看| 美女精品在线| 亚洲国产欧美一区二区三区同亚洲| 久久婷婷国产麻豆91天堂| 久久激情五月婷婷| 欧美va亚洲va香蕉在线| 欧美国产日韩一区二区在线观看| 美乳少妇欧美精品| 亚洲乱亚洲高清| 一区二区三区产品免费精品久久75 | 亚洲精品一区二区三区福利| 亚洲黄色毛片| 亚洲欧美日韩在线观看a三区| 欧美在线观看视频一区二区三区| 久久久久欧美精品| 91久久精品一区二区别| 亚洲综合电影| 欧美日韩一二三四五区| 狠久久av成人天堂| 亚洲男女自偷自拍| 亚洲电影免费观看高清完整版在线 | 欧美小视频在线| 亚洲二区免费| 亚洲综合国产激情另类一区| 理论片一区二区在线| 一本色道久久88精品综合| 久久久精品五月天| 欧美日韩日本网| 一本大道久久a久久精二百| 久久亚洲私人国产精品va媚药| 一区二区三区不卡视频在线观看 | 国产精品久在线观看| 一区二区三区四区五区精品视频 | 亚洲香蕉网站| 夜夜爽av福利精品导航| 欧美黄色片免费观看| 亚洲国产综合91精品麻豆| 免费观看日韩av| 美女爽到呻吟久久久久| 亚洲国产婷婷香蕉久久久久久| 久久久久久久精| 久久一区激情| 一区二区免费看| 亚洲一区二区精品| 国产一区二区精品丝袜| 欧美va亚洲va国产综合| 欧美日本一区二区高清播放视频| 在线视频欧美日韩精品| 在线视频亚洲欧美| 国产一区二区欧美日韩| 另类人畜视频在线| 欧美日韩亚洲一区二区三区四区| 亚洲特黄一级片| 午夜亚洲视频| 一区二区三区欧美| 欧美伊人久久久久久久久影院| 亚洲国内自拍| 久久国产视频网站| av成人国产| 久久综合激情| 久久久久一区二区三区| 黄色成人av在线| 亚洲精品国产系列| 午夜精品久久久久久久久久久久 | 久久―日本道色综合久久| 欧美一区二区三区的| 一区二区激情小说| 免费成人在线视频网站| 亚洲婷婷综合色高清在线| 久久久精品午夜少妇| 好看不卡的中文字幕| 在线一区二区日韩| 国产一区二区你懂的| 欧美在线你懂的| 亚洲福利视频在线| 国产午夜精品视频| 在线一区二区三区四区五区| 黑人巨大精品欧美黑白配亚洲| 亚洲精品少妇网址| 亚洲人成在线播放|