請問要如何安排全域物件建立順序 |
尚未結案
|
jackyung
一般會員 發表:22 回覆:46 積分:13 註冊:2004-01-24 發送簡訊給我 |
|
Windyboy
版主 發表:7 回覆:119 積分:210 註冊:2002-11-07 發送簡訊給我 |
|
pwipwi
版主 發表:68 回覆:629 積分:349 註冊:2004-04-08 發送簡訊給我 |
jackyung你好:
只要在project中把A.cpp拉到B.cpp前,A.cpp的全域變數就會比B.cpp還早建立。一般來說愈早宣告的全域物件,初始化的順序愈前面。 不過面對大的專案時,這個做法很容易出錯。(比如A要用到B,B又要用到C,C又要用到A....)解決這個問題可以利用Singleton來實作, 物件在被用到時才會動態建立。
至於Singleton的實作法很多,以下的網址教的是一種。其他有有興趣再找找,網路上有不少範例。
http://dev.csdn.net/develop/article/31/31361.shtm
|
jackyung
一般會員 發表:22 回覆:46 積分:13 註冊:2004-01-24 發送簡訊給我 |
我用比較麻煩的做法,把對外公開的函數做成指向函數指標,這些函數指標一開始是指向設定函數,第一次叫用時才會把這些函數指標改成真正要叫用的函數。 這樣做的目的是確保在執行 main() 以前所有的全域物件都已存在,第一次叫用那些對外公開的函數時可以繼續建構函數無法做到的工作,即現在可執行建構函數無法確定是否已存在的全域物件了,我把討論重點 class 列在下面 class ErrMsgCenter
{
bool isLive; // 若已完成解構即將結束將變成 false,以免其他執行緒繼續執行
IErrMsgMember *Now; // 目前所使用的 IErrMsgMember 錯誤訊息成員
ICriticalSec *csObject; // 為了能在多執行緒增刪錯誤訊息成員,所以要有一個關鍵區域物件 // 物件第一次被叫用時會用此函數再重設成員函數指標
// 不過最主要的任務在取得第一份錯誤訊息成員物件及取得關鍵區域物件
// 因這樣可以確定要用到的全域物件已經建好了
void PtrSet(void); // 未叫用前成員函數指標所指向的函數,主要在第一次被叫用時呼叫 PtrSet()
void PushPtrSet(IErrMsgMember *Obj);
void PopPtrSet(IErrMsgMember *Obj);
void ShowAnsiPtrSet(const char *);
void ShowUnicodePtrSet(const wchar_t *); // 成員函數指標真正要指定的函數
void PushPtrExecute(IErrMsgMember *Obj);
void PopPtrExecute(IErrMsgMember *Obj);
void ShowAnsiPtrExecute(const char *);
void ShowUnicodePtrExecute(const wchar_t *); // 成員函數指標
void (ErrMsgCenter::*PushPtr)(IErrMsgMember *Obj);
void (ErrMsgCenter::*PopPtr)(IErrMsgMember *Obj);
void (ErrMsgCenter::*ShowAnsiPtr)(const char *);
void (ErrMsgCenter::*ShowUnicodePtr)(const wchar_t *); public:
ErrMsgCenter(void); // Constructor
~ErrMsgCenter(void); // Destructor // 以下四函數會呼叫成員函數指標 // 放入一個新的錯誤訊息成員來取代舊的
void Push(IErrMsgMember *Obj); // 將先前用 Push() 傳入訊息成員的抽出
void Pop(IErrMsgMember *Obj); void operator << (const char *); // ANSI 訊息
void operator << (const wchar_t *); // UNICODE 訊息
};
|
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |