C++思考筆記—–Ruminations on C++ 之 被封裝的指標—-控制代碼

來源:互聯網
上載者:User

       前面一章剛學習了代理類,還說了它解決了什麼樣的問題,它怎麼怎樣的好.這一章立刻又遇到了問題,代理類確實很好的實現了對一類對象的統一管理,但對一弄些情況下.如,一個對象是很大的.大對象有個特點,點用資源多,拷貝它是要花費很大的空間和時間的.而代理類卻大量的對原類進行了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>差不多,這裡就不寫樣本了....

 

-----------------------------------------------------------------------------------------------------------------------------------------------------

 

其實,實現方法,還有很多...有興趣的可以一起討論.以後遇到了經典的,還會再行整理...

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.