一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

C++ Handle(句柄) part1

 筱肆 2014-03-14

C++ Handle(句柄) part1

本文是我學(xué)習(xí)C++沉思錄第6章的筆記

本文主要講述了Handle類的概念,定義方法以及寫時(shí)復(fù)制技術(shù)。

 

在前文(Surrogate代理類)的講解中我們了解到了代理的實(shí)現(xiàn)方法.

代理類有很多好處,但是麻煩的是每次都得進(jìn)行復(fù)制.如果該類是經(jīng)常使用并且member很多的話,這樣復(fù)制的消耗是十分客觀的.

因此這里就要介紹另外一種代理類,Handle,也就是句柄類.

 

為何使用句柄類?

首先就是復(fù)制問題.前面有談到,有些類內(nèi)部數(shù)據(jù)很多,采用復(fù)制消耗非常大,這種情況下就必須采用句柄類來進(jìn)行操作.

其次是由于函數(shù)的參數(shù)和返回值都是采用了復(fù)制進(jìn)行自動(dòng)傳遞.雖然c++中引用可以避免,但是很多情況下返回值采用引用并不明智.

對(duì)于采用指針的方式,可以解決問題,但是又會(huì)引入調(diào)用者對(duì)于動(dòng)態(tài)管理內(nèi)存的麻煩.而這往往是很多錯(cuò)誤的根源.

 

何為句柄類呢?

句柄類可以理解為采用了引用計(jì)數(shù)的代理類.

其多個(gè)句柄共享了同一個(gè)被代理的類.通過引用計(jì)數(shù)的方式來減少復(fù)制以及內(nèi)存管理.

其行為類似指針,因此也有智能指針之稱,但其實(shí)差別很大.后面會(huì)有講述.

 

句柄類例子:

先有一個(gè)簡(jiǎn)單的類Point

復(fù)制代碼
 1 class Point
2 {/*{{{*/
3 public:
4 Point():_x(0),_y(0){}
5 Point(int x,int y):_x(x),_y(y){}
6 int x()const {return _x;}
7 void x(int xv) { _x = xv;}
8 int y()const { return _y;}
9 void y(int yv) { _y = yv;}
10 private:
11 int _x;
12 int _y;
13 };/*}}}*/
復(fù)制代碼

接下來我們要定義其的Handle類.

我們的Handle類:

復(fù)制代碼
 1 class Handle
2 {
3 public:
4 Handle():up(new UPoint){}
5 Handle(int x,int y):up(new UPoint(x,y)){}
6 Handle(const Point&p):up(new UPoint(p)){}
7 Handle(const Handle &h);
8 ~Handle();
9 Handle& operator=(const Handle &h);
10 int x() const{ return up->p.x(); }
11 int y() const{ return up->p.y(); }
12 Handle& x(int);
13 Handle& y(int);
14
15
16 private:
17 UPoint *up;
18 void allocup();
19 };
復(fù)制代碼

這里說明我們的Handle和指針的不同之處.

也許有讀者會(huì)對(duì)Handle有疑問,為什么不采用operator->來直接操作point呢?

其實(shí)顧慮就是operator->返回的是point的地址.也就是使用者可以輕易的獲得point的地址進(jìn)行操作,這并不是我們想要的.這也就是Handle也pointer不想同的地方.

UPoint是為了采用引用計(jì)數(shù)定義的數(shù)據(jù)結(jié)構(gòu)

復(fù)制代碼
 1 //all member is private..only assess by Handle
2 class UPoint
3 {/*{{{*/
4 friend class Handle;
5
6 Point p;
7 int u;//count
8
9 UPoint():u(0){}
10 UPoint(const Point&pv):p(pv){}
11 UPoint(int x,int y):p(x,y),u(1){}
12 UPoint(const UPoint &up):p(up.p),u(1){}
13 };/*}}}*/
復(fù)制代碼

 

對(duì)于Handle類的操作,我們要在Handle類進(jìn)行復(fù)制的時(shí)候,累加Handle指向的UPoint的計(jì)數(shù)值

即復(fù)制構(gòu)造函數(shù)以及賦值函數(shù)

復(fù)制代碼
 1 Handle::Handle(const Handle &h)
2 :up(h.up)
3 {
4 ++up->u;
5 }
6
7 Handle& Handle::operator=(const Handle &h)
8 {
9 ++h.up->u;
10 if (--up->u == 0)
11 delete up;
12 up = h.up;
13 return *this;
14 }
復(fù)制代碼

而對(duì)于析構(gòu)函數(shù),則是減小引用計(jì)數(shù),如果減到0了,就說明沒有其他的Handle指向了UPoint,因此我們要?jiǎng)h除掉.

1 Handle::~Handle()
2 {
3 if (--up->u == 0)
4 delete up;
5 }

剩下的就是定義Handle對(duì)于Point的操作了.即Handle::x(int xv)和Handle::(int yv)了.

這里有2種寫法.

一種是像指針一樣,對(duì)于賦值,就直接修改指向的Point里面的值.這種方法有一個(gè)問題,即所以都指向這個(gè)Point的Handle類獲取的x值都會(huì)變化.

代碼:

復(fù)制代碼
 1 //point like
2 Handle& Handle::x(int xv)
3 {
4 up->p.x(xv);
5 return *this;
6 }
7 //point like
8 Handle& Handle::y(int yv)
9 {
10 up->p.y(yv);
11 return *this;
12 }
復(fù)制代碼

 

還有一種是寫時(shí)復(fù)制技術(shù),即每次對(duì)于共享的Point進(jìn)行修改的時(shí)候都復(fù)制一份新的Point,然后進(jìn)行修改.

這種技術(shù)在Handle中大量采用.在stl中,string也采用了同樣的方法.

其額外開銷很小,而效率也不差.

代碼:

復(fù)制代碼
 1 void Handle::allocup()
2 {
3 if (up->u != 1)
4 {
5 --up->u;
6 up = new UPoint(up->p);
7 }
8 }
9
10 Handle& Handle::x(int xv)
11 {
12 allocup();
13 up->p.x(xv);
14 return *this;
15 }
16
17 Handle& Handle::y(int yv)
18 {
19 allocup();
20 up->p.y(yv);
21 return *this;
22 }
復(fù)制代碼


至此,Handle類的第一部分就講完了.

之后會(huì)有第二部分的講解.解決了多出了一個(gè)UPoint的麻煩.



分類: c++
標(biāo)簽: c++, Handle, 句柄類
0
0
(請(qǐng)您對(duì)文章做出評(píng)價(jià))

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多

    丝袜美女诱惑在线观看| 亚洲欧美日本成人在线| 国产精品白丝一区二区| 日本久久精品在线观看| 亚洲第一视频少妇人妻系列| 日韩欧美第一页在线观看| 欧美一级黄片欧美精品| 人妻中文一区二区三区| 夫妻性生活真人动作视频| 国产欧美一区二区三区精品视| 久草视频在线视频在线观看| 日韩中文字幕狠狠人妻| 亚洲超碰成人天堂涩涩| 伊人国产精选免费观看在线视频| 国产一级精品色特级色国产| 中文字幕精品一区二区三| 日本在线不卡高清欧美| 亚洲精品一区二区三区免| 国产av乱了乱了一区二区三区| 亚洲免费黄色高清在线观看| 国产精品超碰在线观看| 精品推荐久久久国产av| 亚洲精品国产福利在线| 日本精品最新字幕视频播放| 日韩精品日韩激情日韩综合| 午夜亚洲精品理论片在线观看| 伊人欧美一区二区三区| 色鬼综合久久鬼色88| 亚洲国产成人久久99精品| 免费一级欧美大片免费看| 亚洲中文字幕视频在线播放| 午夜激情视频一区二区| 日本精品理论在线观看| 不卡一区二区在线视频| 粉嫩内射av一区二区| 中文字幕日韩一区二区不卡| 亚洲三级视频在线观看免费| 欧美在线观看视频三区| 亚洲欧美精品伊人久久| 91人妻久久精品一区二区三区| 国产欧美日韩综合精品二区|