句柄術(shù)語一般用來指獲取另一個(gè)對象的方法——一個(gè)廣義的假指針。這個(gè)術(shù)語是(故意的)含糊不清的。
含糊不清在實(shí)際中的某些情況下是有用的。例如,在早期設(shè)計(jì)時(shí),你可能不準(zhǔn)備用句柄來表示。你可能不確定是否將一個(gè)簡單的指針或者引用或者指向指針的指針或者指向引用的指針或者整型標(biāo)識符放在一個(gè)數(shù)組或者字符串(或其它鍵)以便能夠以哈希表(hash-table)(或其他數(shù)據(jù)結(jié)構(gòu))或數(shù)據(jù)庫鍵或者一些其它的技巧來查詢。如果你只知道你會需要一些唯一標(biāo)識的東西來獲取對象,那么這些東西就被稱為句柄。
因此,如果你的最終目標(biāo)是要讓代碼唯一的標(biāo)識/查詢一個(gè)Fred類的指定的對象的話,你需要傳遞一個(gè)Fred句柄這些代碼。句柄可以是一個(gè)能被作為眾所周知的查詢表中的鍵(key)來使用的字符串(比如,在std::map<std::string,Fred> 或 std::map<std::string,Fred*>中的鍵),或者它可以是一個(gè)作為數(shù)組中的索引的整數(shù)(比如,F(xiàn)red* array = new Fred[maxNumFreds]),或者它可以是一個(gè)簡單的 Fred*,或者它可以是其它的一些東西。
初學(xué)者常常考慮指針,但實(shí)際上使用未初始化的指針有底層的風(fēng)險(xiǎn)。例如,如果Fred對象需要移動怎么辦?當(dāng)Fred對象可以被安全刪除時(shí)我們?nèi)绾潍@知?如果Fred對象需要(臨時(shí)的)連續(xù)的從磁盤獲得怎么辦?等等。這些時(shí)候的大多數(shù),我們增加一個(gè)間接層來管理位置。例如,句柄可以是Fred**,指向Fred*的指針可以保證不會被移動。當(dāng)Fred對象需要移動時(shí),你只要更新指向Fred*的指針就可以了。或者讓用一個(gè)整數(shù)作為句柄,然后在表或數(shù)組或其他地方查詢Fred的對象(或者指向Fred對象的指針)。
重點(diǎn)是當(dāng)我們不知道要做的事情的細(xì)節(jié)時(shí),使用句柄。
使用句柄的另一個(gè)時(shí)機(jī)是想要將已經(jīng)完成的東西含糊化的時(shí)候(有時(shí)用術(shù)語magic cookie也一樣,就像這樣,“軟件傳遞一個(gè)magic cookie來唯一標(biāo)識并定位適當(dāng)?shù)腇red對象”)。將已經(jīng)完成的東西含糊化的原因是使得句柄的特殊細(xì)節(jié)或表示物改變時(shí)所產(chǎn)生的連鎖反應(yīng)最小化。舉例來說,當(dāng)將一個(gè)句柄從用來在表中查詢的字符串變?yōu)樵跀?shù)組中查詢的整數(shù)時(shí),我們可不想更新大量的代碼。
當(dāng)句柄的細(xì)節(jié)或表示物改變時(shí),維護(hù)工作更為簡單(或者說閱讀和書寫代碼更容易),因此常常將句柄封裝到類中。這樣的類常重載operator-> 和 operator*算符(既然句柄的效果象指針,那么它可能看起來也象指針)。