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

隨筆 - 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>
            欧美va天堂va视频va在线| 欧美日韩综合一区| 久久久久欧美| 欧美视频在线不卡| 亚洲国产精品久久久久婷婷884| 99在线观看免费视频精品观看| 欧美伊人久久久久久午夜久久久久| 亚洲精品1区| 久久久久免费| 韩国福利一区| 久久蜜臀精品av| 亚洲欧美日韩天堂一区二区| 亚洲高清视频在线观看| 午夜精品在线| 国产精品盗摄久久久| 一区二区国产精品| 91久久香蕉国产日韩欧美9色| 久久久久网站| 一区精品在线播放| 老司机成人网| 久久精品国产久精国产思思| 国产欧美一区二区色老头| 欧美一区二区免费| 亚洲欧美一区二区三区在线| 国产精品日韩久久久| 欧美一级大片在线免费观看| 亚洲男人第一av网站| 国产欧美日韩一区二区三区在线 | 午夜精品久久久久| 国产精品你懂的在线欣赏| 亚洲一区二区三区在线视频| 夜夜精品视频一区二区| 欧美色区777第一页| 亚洲男女毛片无遮挡| 亚洲综合三区| 伊人久久婷婷色综合98网| 欧美风情在线观看| 欧美日韩成人综合| 午夜在线a亚洲v天堂网2018| 在线观看国产成人av片| 午夜激情一区| 国产欧美精品日韩| 久久亚洲色图| 欧美激情亚洲综合一区| 国产精品99久久久久久www| 一区二区三区精品久久久| 国产精品嫩草久久久久| 久久综合色播五月| 欧美精品一区二区三区一线天视频| 亚洲天天影视| 久久久国产91| 在线亚洲免费视频| 久久激情网站| 一区二区三区你懂的| 欧美一区二区三区四区高清| 亚洲激情二区| 亚洲一区二区三区激情| 一区二区在线观看av| 亚洲精品五月天| 国产一区二区日韩精品| 亚洲国产精品一区制服丝袜 | 麻豆成人综合网| 国产精品99久久99久久久二8| 欧美一级视频一区二区| 亚洲精品中文在线| 欧美一区二区三区四区在线观看| 亚洲精品美女免费| 欧美亚洲免费电影| 一区二区三区四区精品| 裸体一区二区三区| 欧美精品情趣视频| 久久久久欧美| 国产精品www.| 亚洲激情第一区| 国内成+人亚洲| 一区二区91| 日韩午夜电影| 久久综合给合| 久久精彩免费视频| 国产精品热久久久久夜色精品三区| 欧美福利视频在线观看| 国产日韩欧美在线观看| 一区二区av在线| 亚洲靠逼com| 久久久亚洲国产天美传媒修理工| 亚洲欧美精品一区| 欧美精品一区二区三区久久久竹菊| 久久久噜噜噜久久中文字幕色伊伊| 欧美视频中文字幕在线| 亚洲区第一页| 亚洲人成啪啪网站| 久久成人在线| 久久精品色图| 国产日韩欧美在线播放| 亚洲男人的天堂在线| 午夜在线电影亚洲一区| 欧美午夜片欧美片在线观看| 亚洲乱码国产乱码精品精| 亚洲精品美女久久7777777| 欧美成人午夜激情视频| 一区免费视频| 欧美一区二区三区免费视频| 欧美在线观看一区| 国产精品免费一区豆花| 亚洲一区二区三区精品在线| 亚洲综合色丁香婷婷六月图片| 欧美日本国产| 99视频精品| 亚洲一区免费视频| 国产精品九九久久久久久久| 夜夜嗨av色综合久久久综合网| 亚洲在线观看免费| 国产精品免费aⅴ片在线观看| 一道本一区二区| 亚洲欧美日韩精品久久久久| 国产精品高潮视频| 亚洲欧美在线一区| 久久久五月天| 亚洲国产精品久久久久婷婷884| 欧美xx视频| 中文高清一区| 久久精品国产亚洲a| 亚洲第一成人在线| 欧美精品激情在线观看| 亚洲调教视频在线观看| 久久久一区二区三区| 亚洲人成艺术| 国产精品久久久久9999| 欧美呦呦网站| 亚洲欧洲三级电影| 亚洲欧美激情一区二区| 国内精品伊人久久久久av影院 | 欧美私人啪啪vps| 亚洲欧美福利一区二区| 久久久综合网站| 最近看过的日韩成人| 欧美日韩美女| 久久婷婷人人澡人人喊人人爽| 日韩午夜电影在线观看| 国产精品国产三级国产普通话蜜臀 | 亚洲欧美成aⅴ人在线观看| 国产伦精品一区二区三| 久久久久国产一区二区三区四区| 亚洲激情在线激情| 久久av资源网站| 亚洲精品激情| 国产欧美一级| 欧美精品三级| 亚洲欧美日韩国产中文 | 亚洲精选在线观看| 久久久久久久久久久成人| 亚洲美女视频在线观看| 国产一区二区三区不卡在线观看| 欧美激情第10页| 久久精品日产第一区二区| 久久精品盗摄| 亚洲天堂av在线免费| 精品成人一区| 国产精品亚洲综合一区在线观看| 欧美高清在线一区二区| 欧美伊人久久久久久久久影院| 99精品国产在热久久婷婷| 母乳一区在线观看| 久久成人精品无人区| 亚洲一区二区三区乱码aⅴ蜜桃女 亚洲一区二区三区乱码aⅴ | 一本一本久久| 欧美激情自拍| 久久午夜色播影院免费高清| 亚洲欧美激情四射在线日| 亚洲另类自拍| 亚洲黄色在线看| 激情视频一区| 国产偷国产偷亚洲高清97cao| 欧美日韩综合在线免费观看| 欧美极品一区| 欧美大片在线观看一区二区| 久久视频在线免费观看| 欧美在线视频一区二区三区| 亚洲欧美激情精品一区二区| 亚洲一区视频在线| 亚洲午夜视频在线| 亚洲无线视频| 亚洲图片自拍偷拍| 亚洲一区欧美一区| 亚洲影院免费| 午夜在线观看免费一区| 亚洲女同精品视频| 亚洲欧美在线视频观看| 午夜精品影院在线观看| 欧美一区二区三区男人的天堂| 欧美一级在线视频| 久久www免费人成看片高清| 欧美综合77777色婷婷| 久久成人综合网| 麻豆精品精品国产自在97香蕉| 久久久免费观看视频| 猛男gaygay欧美视频| 欧美国产在线观看| 国产精品福利片| 国产午夜精品理论片a级探花|