全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:822
推到 Plurk!
推到 Facebook!

請問要如何安排全域物件建立順序

尚未結案
jackyung
一般會員


發表:22
回覆:46
積分:13
註冊:2004-01-24

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-08-26 16:54:56 IP:218.171.xxx.xxx 未訂閱
全域物件是指未進入 main() 即建立好的物件,如 cout 就是, 假設我在 A.cpp 及 B.cpp 分別建有全域物件,B.cpp 的物件會 參用 A.cpp 的物件,所以 A.cpp 須比 B.cpp 早一步被建立, 請問要如何安排這種順序呢?
Windyboy
版主


發表:7
回覆:119
積分:210
註冊:2002-11-07

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-08-27 11:58:26 IP:220.130.xxx.xxx 未訂閱
你好: 如果要在B.cpp用到A.cpp的變數, 在B.cpp中 extern A.cpp的變數, 就可以使用了, 也不用管誰先建立. 例如A.cpp中有 int testdata; 在B.cpp中宣告一行 extern int testdata; 這樣就行了...try it... 我沒實際寫個程式, 如果有問題, 大家再討論. -------------------------- ~天下本無事 庸人自擾之~
pwipwi
版主


發表:68
回覆:629
積分:349
註冊:2004-04-08

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-09-04 01:43:10 IP:211.76.xxx.xxx 未訂閱
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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-09-04 17:03:31 IP:220.140.xxx.xxx 未訂閱
我用比較麻煩的做法,把對外公開的函數做成指向函數指標,這些函數指標一開始是指向設定函數,第一次叫用時才會把這些函數指標改成真正要叫用的函數。 這樣做的目的是確保在執行 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 訊息 };
系統時間:2024-06-28 2:10:27
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!