前面一章剛學習了代理類,還說了它解決了什麼樣的問題,它怎麼怎樣的好.這一章立刻又遇到了問題,代理類確實很好的實現了對一類對象的統一管理,但對一弄些情況下.如,一個對象是很大的.大對象有個特點,點用資源多,拷貝它是要花費很大的空間和時間的.而代理類卻大量的對原類進行了copy.所以問題就有了.當然,對於一些小類,而又需要很好的管理他們,代理類依然是很好用的...
-------------------------------------------------------------------------------------------------------------------------------
控制代碼類解決的問題.
控制代碼類,也並不只是為瞭解決代理的問題,那隻是很小的一部分..可是想像這樣一種情形,比如,我有一個類封裝了對資料庫的操作.而其它兩個類都需要對其進行調用,(這是很常見的問題.),所要做的就是把資料庫類的對象的地址給另外兩個類,這樣功能是實現了,可是當我對資料庫存操作完成需要釋放資料庫物件的時候,就是個問題了.(當然,不去釋放是不被允許的),
很容易想到解決的方法,,可以在前面的資料庫類裡加一個記錄此對象被引用次數的私人成員,並提供相應的提供者.問題解決..
-------------------------------------------------------------------------------------------------------------------------------
我對控制代碼的認識,
在我看來,控制代碼就是我們起的一個名子,我們為了正好的管理我們的指標(記憶體),上面那樣只在類裡加一個記數器,我們依然可以把這個過程叫做控制代碼,(其實,指標還是那個指標,沒有什麼特別的).
如果把上面說的控制代碼看成是一個廠義上的概念,那麼接下來要總結一下狹義概念了.(真正做到對指標對記憶體管理的封裝,)
我大一下半年,我在學習mfc和win32的時候第一次聽到控制代碼這個概念,對於新概念,當然是很迷惑的,當時學長告訴我,就把它理解成指標(當時的水平,根本沒有記憶體管理,軟體安全方面的覺悟吧,所以,理解成指標也不會有什麼問題),到後來接觸的越來越多,Thinking in C++,C++ primary,和其它的一些書,還有做其它項目時候網路上偶爾相遇,再到現在讀的此書,每一次的經曆,都會有一個認識上的提升,(當然,以後還會繼續提升).
下面是一些經典的封裝:
class Handle {
public:
Handle();
Handle(const AClass &);
Handle(const AClass *);
Handlw& operator=(const Handle&);
~Handle()
{
if(--count==0)
delete p;
}
private:
//...
AClass *p;
};
大部分物件導向的控制代碼(類)大概都包含這些屬性,許多封閉的不同之處就在於,計數器count所放的位置,
-----------------------------------------------------------------------------------------------------------------------------------------------------
1>count作為Handle類的static 公有成員.
類的static成員的作用就是站在class的高度(而不屬於某個執行個體),所以可以用它來作計數器,,
2>count作為原類的一個成員變數,用它來統計指向原類某個對象的指標個數..
這種方法與方法1>的區別可能不好看出...現在舉一個例子,就能很容易找到它們之間的不同.
##: 第一種方法計數器是針對這個類的,第二種是針對,這個類的每一個對象的.
第一種方法要求這個類只能被執行個體化一次,為什麼這麼說呢..如果你執行個體化兩次(多次),那麼它們會共用一個計數器,(這顯然是很危險的),
所以用這種方法的前提是,我這個類只要一個執行個體就能夠完成任務,,而且要在原類中加個static控制開關,當有一個執行個體了,就把開關關掉,防止再次被執行個體化
第二種方法就沒有上面的問題:但是解構函式要改為:
Handle::~Handle()
{
count =p.getCount();//這裡count 為類的私人成員,用提供者訪問
if(--count==0)
delete p;
else
p.setCount(count);
}
這樣count只賴於特定的對象,,就可以出現程式中多個執行個體並存了.
3>另外定義一個伴隨類,類只有原對象(引用)和記數器,Handle類和上面基本相同,只是沒了直接的原來指標,取而代之的是原類的伴隨類指標,
這種方法,也有個好處(當然,沒有好處,那就沒必要用它了.),就是原類中只有實現自己功能的成員,而沒有外來成員(count)了,外來成員被統一放到伴隨類裡.
實現方法和2>差不多,這裡就不寫樣本了....
-----------------------------------------------------------------------------------------------------------------------------------------------------
其實,實現方法,還有很多...有興趣的可以一起討論.以後遇到了經典的,還會再行整理...