乙個全域性物件管理類

2021-06-10 01:13:11 字數 2134 閱讀 9930

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...