class global_p
這樣,只要在建構函式裡面new,在析構函式裡面delete就可以了。構造和析構的順序完全由你來決定。比如在對應的cpp檔案裡:
global_p::global_p()
global_p::~global_p()
這樣就很簡單的實現了順序構造,逆序析構。而與此同時,第二個問題也迎刃而解了,只要把new和delete的語句用try...catch包圍起來,就能夠捕獲ca和cb構造/析構時丟擲的異常。
這時候我們面臨乙個問題,就是現在仍然需要用global_p定義為乙個全域性物件,而且必須保證這個物件是唯一的,這很容易讓人想起設計模式中的singleton,單件。c++實現這個非常簡單,只要宣告建構函式和析構函式為私有,然後新增乙個static成員函式,返回乙個自身的static例項就可以了。
修改後的**如下:
//.h檔案
class global_p
;//.cpp檔案
global_p & global_p::instance()
global_p::global_p()
catch(...) }
global_p::~global_p()
catch(...) }
到現在為止,乙個比較安全和易於控制的全域性物件管理器就構造成功了,下面開始實現對其內部成員的訪問控制。最簡單的方法就是把成員變數轉移到public域,但是這樣有可能帶來其他不好的後果。
在此,我打算用一種比較怪異的方式實現訪問:
首先提一下對類成員的過載,這種過載包括了對型別轉化的過載,也就是我想要使用的方法:
為類global_p新增如下公有成員方法:
operator ca & ();
operator cb & ();
實現:
global_p::operator ca & ()
global_p::operator cb & ()
於是所有的訪問都變得直接了:
只要 ( (ca&)global_p.instance()) 就得到了ca物件的全域性唯一例項。但是這個形式看起來還是很麻煩,而且難以理解,為了讓最終的呼叫看起來更順眼一些,我們需要借助一下template的魔力。
template
t &g_()
好了,現在我們可以用
g_()這種很直觀的形式來呼叫ca的全域性唯一例項了,對於只需要有乙個例項的全域性物件來說,這個例項已經能夠滿足全部安全和有效的需求了。儘管**看起來很繁瑣,不過因為全域性物件的數量一般而言都是有限的,並且在開發過程中修改的頻率也比較低,所以還是可以忍受的。
以下是完整**(包括測試**):
//.h檔案
#include
using namespace std;
class ca };
class cb };
class global_p
;//引用全域性物件用的模板。
template
t &g_()
//.cpp檔案
global_p::global_p()
catch(...) }
global_p::~global_p()
catch(...) }
global_p& global_p::instance()
global_p::operator ca & ()
global_p::operator cb & ()
//測試**
void main()
這種實現方法仍然存在幾個比較大的問題,
首先,某種型別的全域性變數只能有乙個,
其次,並不能保證這個例項的析構時間在其他靜態物件之後,
第三,因為使用了模板,編輯和除錯的難度增加了,
最後,如果**中有對new,delete等操作符的過載,或者ca,cb擁有特殊構造/析構手法,**的有效性就會大打折扣。
為了解決這幾個問題,可以對t &g_()增加額外的模板引數,從而實現同一型別變數多個例項,第二個問題,可以參考《c++設計新思維》(候捷譯)中關於singleton不同實現的內容部分解決global_p例項析構過早的問題。最後兩個問題只能由編碼者自己解決了:p
-------by panic,2023年1月11日晚19:49分於廈門。
乙個IIS管理類
using system using system.data using system.directoryservices using system.collections namespace testurlre public iismanager string strserver 定義公共屬性 p...
乙個TimerTask的管理類
在管道流的接收方用pipedinputstream.read byte 是乙個阻塞式的讀取,而這個讀取一般是放在乙個執行緒中的,這時我們就需要給這個讀取過程設定乙個時間限制,如果時間到了就結束執行緒。這是乙個執行緒管理類,作用是管理一些有阻塞的執行緒的結束。方法說明 建立乙個timer物件作為定時器...
使用類管理另乙個類物件集合
1.關於實現ienumrable介面的類 在類進行初始化時候,可以呼叫實現的add方法 class demo ienumerable public ienumerator getenumerator 如乙個實現ienumerable的類demo,在例項化的時候可以這樣寫 demo demo newd...