SharePtr非侵入版本

2021-08-22 09:11:21 字數 1490 閱讀 6191

本blog原來那篇《智慧型指標三兄弟》:

,在智慧型指標的使用上,使用了侵入式的設計。欲使用智慧型指標,則必須為每個使用智慧型指標的類生成乙個static的invalid物件。如果是自己寫乙個庫自己用那大凡沒有問題,但如果用在別人的庫上,這就吃虧了。

invlalid物件的主要作用是:在解引用(*),指向(->)等操作發生的時候,當智慧型指標發現自己所接管的指標是乙個null,就會把指標重定位到invalid物件上去。以防使用者既不寫try(比如像我這樣的「異常無視流」的堅定支持者: p。題外話,如果要是乙個try的堅定支持者的話,那麼boost的智慧型指標庫就很好用了,剩下的內容您就不用看了 ^_^ ),又不判斷指標合法與否而導致程式掛掉。現在不讓你掛了,只是滿天遍地給你報日誌,告訴你引用了某某某非法物件。

對於乙個抽象或者非抽象類,invalid類往往應從它們派生,並刪除其主要操作函式的實現,轉而僅輸出log後就返回錯誤值。如果您對使用者的c++功底放心,那麼也可以選擇throw乙個異常,這對這些使用者也是乙個好處——異常多了他們自己就記住該怎麼去try catch了。助人為樂,幫人學習,此乃功德無量,功德無量……(眾人:扔磚!)

invalid類和物件應有如下特徵:

invalid物件有且僅有乙個,且應以例項方式建立自invalid類。因為invalid物件多了也沒用,乙個就夠了。

invalid類的addref和release方法應該架空。在這套體系下,使用者很可能會繼續無視指標是否合法(因為現在不合法已經不會讓他們的程式掛掉了),因此更可能會誤呼叫invalid物件的release和addref。addref還好,但release在很多人寫起來往往就是if(--ref == 0) delete this;這種情況自然導致對乙個唯一的、在桟上建立(而不是在堆上建立)、而且還到處被引用的物件的delete操作,接下來的結果——上帝對我說:「那就不是你我能知道的了」……

重新說一下invalid,下面開始本帖想說的主題:

昨天散步的時候想到,關於類和invalid類,是一一對應的,其實可以把他看作乙個類和乙個invalid類組成了乙個pair,這意味著什麼呢?如何在編譯期實現pair,你想起來了麼?

傳說中的traits!

(下面的**按照記憶所寫,可能語法過不去……)

template

struct invalidclasstraits ;

這裡,classa和null_classa是原始類和invalid類。

用的時候怎麼用呢?

下面:template

struct _invalid ;

cpp裡:

void a_null::do()

//throw; or log ; or other ...

即可。使用者使用智慧型指標還是原來的樣子:tshareptrptra = ......

不過注意,所有對這個智慧型指標的使用必須在順序上後於

template<> struct invalidclasstraits ;

這句宣告,否則會導致無法鏈結的錯誤。

李巍(noslopforever·天堂裡的死神)

侵入性與非侵入性

1.軟體設計的標準是 高內聚,低耦合 侵入性強指的是耦合太強了。判斷的標準就是當引入了這個元件導致其它 或者設計要做相應的更改以適應新元件。這樣的情況我們就認為這個新元件具有侵入性。2.侵入性表現為使用者 需要繼承框架提供的類。非侵入性則不需要使用者 引入框架 的資訊,從類的編寫者角度來看,察覺不到...

侵入式和非侵入式的區別

簡單說一下我的理解吧。假設大家都想要把使用者 塞到乙個框架裡。侵入式的做法就是要求使用者 知道 框架的 表現為使用者 需要繼承框架提供的類。非侵入式則不需要使用者 引入框架 的資訊,從類的編寫者角度來看,察覺不到框架的存在。例如 使用struts的時候,我需要繼承一些struts的類,這時strut...

Spring 中侵入式與非侵入式的區別

假設大家都想要把使用者 塞到乙個框架裡。侵入式的做法就是要求使用者 知道 框架的 表現為使用者 需要繼承框架提供的類。非侵入式則不需要使用者 引入框架 的資訊,從類的編寫者角度來看,察覺不到框架的存在。例如 1 使用struts的時候,我需要繼承一些struts的類,這時struts侵入到了我的 裡...