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

隨筆 - 87  文章 - 279  trackbacks - 0
<2005年11月>
303112345
6789101112
13141516171819
20212223242526
27282930123
45678910

潛心看書研究!

常用鏈接

留言簿(19)

隨筆分類(81)

文章分類(89)

相冊(cè)

ACM OJ

My friends

搜索

  •  

積分與排名

  • 積分 - 219480
  • 排名 - 118

最新評(píng)論

閱讀排行榜

評(píng)論排行榜

發(fā)覺計(jì)算機(jī)很多東西都是相同的,記得操作系統(tǒng)時(shí)候?qū)W過這一概率 copy on write,在Reference Counted中徹底用到,代碼的設(shè)計(jì)確實(shí)精妙,可以在不修改客戶端得類,利用RCIPtr間接指針,對(duì)客戶端的類實(shí)現(xiàn)引用計(jì)數(shù),太妙了,詳細(xì)見代碼吧,代碼中Widget為已有的客戶端的類,RCIPtr是一個(gè)間接指針,RCObject是引用計(jì)數(shù)的基類,所有需要引用計(jì)數(shù)的類都必須繼承他,換句話說,RCObject類將引用計(jì)數(shù)邏輯封裝了,而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;                    //測(cè)試用,獲取指針?biāo)赶虻膶?duì)象的引用數(shù)
private :
    
struct CountHolder : public RCObject {                //T的實(shí)際的指針保寸的地方
        ~CountHolder() {delete pointee;};
        T
* pointee;
    }
;
    CountHolder 
*counter;
    
void init();                            //初始化公共代碼
    void makeCopy();                        //Copy On Write的調(diào)用函數(shù)
}
;

#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();                        //標(biāo)記object不可共享
    bool isShareable() const;                    //判斷object是否可被共享
    bool isShared() const;                        //判斷object是否被共享中
    int getRefCount() const;                    //獲取對(duì)象的引用數(shù)
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;                                //引用計(jì)數(shù)
    bool shareable;                                //可否共享標(biāo)記
}
;

#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測(cè)試類
 
*/

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

 只要每次寫一個(gè)類似的RC類,就不用修改客戶端已有的類,而又可以實(shí)現(xiàn)Reference-Counting了

posted on 2008-04-09 21:36 閱讀(565) 評(píng)論(0)  編輯 收藏 引用 所屬分類: C++之夢(mèng)
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            久久国产主播精品| 国产精品一区二区在线观看不卡| 亚洲韩日在线| 欧美成人亚洲成人| 欧美黄在线观看| 亚洲国产三级网| 夜夜爽夜夜爽精品视频| 一本一本a久久| 亚洲欧美中文在线视频| 久久精品毛片| 欧美国产亚洲视频| 国产精品对白刺激久久久| 国产精品久久一卡二卡| 黄色一区二区在线| 亚洲另类视频| 久久国产88| 亚洲国产1区| 亚洲砖区区免费| 久久这里有精品视频 | 欧美一区二区三区四区夜夜大片 | 欧美日韩高清在线观看| 国产三级精品在线不卡| 亚洲人体影院| 久久精品一区二区三区中文字幕| 欧美成人亚洲| 性欧美xxxx视频在线观看| 欧美国产一区二区| 国产婷婷精品| 亚洲午夜精品久久| 欧美国产精品日韩| 久久久国产精品一区| 欧美色大人视频| 亚洲国产精品成人综合色在线婷婷 | 亚洲自拍偷拍视频| 欧美激情欧美狂野欧美精品| 午夜亚洲伦理| 欧美视频在线一区| 一本色道久久综合亚洲二区三区| 久久久亚洲欧洲日产国码αv | 在线观看国产精品网站| 先锋影音国产精品| 亚洲精品中文字幕女同| 你懂的亚洲视频| 黄色成人免费观看| 欧美在线一区二区三区| 在线综合视频| 欧美日韩一区二区三区在线| 亚洲日韩欧美视频一区| 欧美激情a∨在线视频播放| 久久精品国产99国产精品| 国产精品视频久久| 亚洲欧美日韩视频二区| 亚洲影音一区| 正在播放日韩| 国产精品久久久久影院色老大| 亚洲美女色禁图| 亚洲国产精品福利| 欧美黑人在线播放| 亚洲麻豆av| 亚洲精品黄色| 欧美国产1区2区| 99精品热6080yy久久| 亚洲全部视频| 欧美日韩精品免费观看视频完整| 99精品国产一区二区青青牛奶| 欧美好骚综合网| 欧美成人免费va影院高清| 亚洲人成在线播放网站岛国| 亚洲日本成人女熟在线观看| 欧美日本韩国一区二区三区| 在线亚洲精品| 亚洲欧美日韩国产另类专区| 国产人成精品一区二区三| 欧美在线日韩| 久久一区二区三区av| 亚洲精品在线一区二区| 亚洲国产精品成人综合| 亚洲免费在线精品一区| 欧美日韩中文字幕日韩欧美| 一区二区电影免费观看| 亚洲毛片在线观看.| 欧美午夜精品久久久久免费视| 亚洲欧美在线观看| 久久久久久久999| 亚洲美女尤物影院| 亚洲午夜视频| 伊人成人开心激情综合网| 亚洲福利视频一区二区| 国产精品美女久久久久久免费| 久久久999精品免费| 欧美肥婆在线| 久久精品观看| 欧美日韩精品欧美日韩精品一| 香蕉成人久久| 欧美激情第4页| 欧美在线一区二区| 欧美高清在线视频| 久久精品中文字幕一区二区三区| 欧美 日韩 国产一区二区在线视频| 亚洲一级在线观看| 久久亚洲综合色一区二区三区| 在线亚洲激情| 裸体女人亚洲精品一区| 亚洲欧美日韩国产另类专区| 久久亚洲春色中文字幕| 午夜精品久久久久久久久久久久久| 久久成人羞羞网站| 亚洲专区在线| 欧美精品国产精品| 久久一区二区三区国产精品 | 黄色成人免费网站| 99精品99| 亚洲黄一区二区三区| 亚洲伊人网站| 日韩一区二区精品视频| 久久成人18免费网站| 亚洲永久免费观看| 欧美日本精品一区二区三区| 久久综合一区| 国产亚洲视频在线| 亚洲性感美女99在线| 99re66热这里只有精品3直播 | 欧美电影专区| 欧美 日韩 国产 一区| 国产午夜精品一区二区三区欧美| 亚洲免费电影在线观看| 亚洲免费电影在线| 欧美激情一区二区久久久| 欧美**人妖| 亚洲福利国产精品| 久久亚洲欧美国产精品乐播| 欧美r片在线| 最新日韩精品| 欧美欧美天天天天操| 最新亚洲视频| 亚洲伦伦在线| 欧美吻胸吃奶大尺度电影| 日韩一级黄色av| 亚洲一区视频| 国产精品亚洲精品| 香蕉久久夜色精品| 久久―日本道色综合久久| 国内精品亚洲| 久久综合狠狠综合久久综合88 | 亚洲国产精品久久久久久女王| 久久久久天天天天| 欧美福利一区| aa亚洲婷婷| 国产精品久久久久久户外露出 | 欧美日韩三级在线| 99视频在线观看一区三区| 午夜精品久久久久久久99水蜜桃 | 欧美高清视频一区二区| 亚洲人成亚洲人成在线观看图片 | 欧美亚洲日本国产| 久久影院午夜论| 91久久国产精品91久久性色| 欧美不卡高清| 一区二区三区精品久久久| 亚洲欧美日韩一区二区在线 | 欧美一级视频精品观看| 久久精品综合| 99精品久久免费看蜜臀剧情介绍| 欧美三级视频在线播放| 亚洲欧美日韩国产中文在线| 久久精品欧洲| 日韩亚洲在线| 国产欧美日韩免费| 欧美国产日韩一区二区| 亚洲一区国产一区| 欧美成人福利视频| 亚洲欧美一区二区三区在线| 一区二区三区无毛| 欧美系列一区| 美乳少妇欧美精品| 亚洲欧美日韩网| 亚洲黄色高清| 久久久人成影片一区二区三区| 亚洲理论在线| 激情欧美日韩| 国产精品伊人日日| 欧美精品三级在线观看| 欧美一区激情| 一本色道久久综合| 亚洲高清在线视频| 久久婷婷丁香| 午夜精品国产| 夜夜嗨av一区二区三区四区| 精品成人一区| 国产欧美日韩亚州综合| 欧美日韩国产免费观看| 久久婷婷国产综合尤物精品| 亚洲一区二区三区精品在线| 亚洲国产精品日韩| 欧美大片网址| 免费久久精品视频| 久久久久青草大香线综合精品| 午夜在线a亚洲v天堂网2018| 一区二区三区鲁丝不卡| 亚洲伦伦在线|