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

[C++] 請問如何安排啟動順序

尚未結案
jackyung
一般會員


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

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-02-16 11:38:25 IP:220.131.xxx.xxx 未訂閱
我寫了一些程式庫,會自動提供一些全域的物件給程式使用,做法是 在模組(*.cpp 檔)中,所有函數之外,加上像以下的程式碼: MyClass *MyObj = new MyClass; 這樣就可以在程式執行 main() 以前先建好 MyObj 物件,可以像 cout、cin.... 直接使用。 但問題是若程式也想要建立其他的全域物件,而這個全域物件也會叫 用 MyObj,要如何確保 MyObj 比這個 全域物件 先被建立。 我知道 BCB 有提供 #pragma startup 可以安排建立全域物件的順序,但這 是 BCB 的功能,有沒有較好的方法可以適用在各平台或編譯器
jackyung
一般會員


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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-02-27 22:42:48 IP:218.171.xxx.xxx 未訂閱
我從高手那學到一個技巧,看以下例子會比較清楚。    TETT.HPP 引入檔
----------------    // 假設在以下 class 提供兩個函數
class A
{
  int data;
public:
  A(void);  
  ~A(void);        int Func1(void);
  void Func2(int);
};    // 取得 class A 的產生的物件
extern A &Aget(void);    #define Aobj Aget()        TEST.CPP 程式碼
-------------------    int A::Func1(void)
{
  return data;
}    void A::Func2(int D)
{
  data = D;
}    // 第一次呼叫會建立 class A 的靜態物件
A &Aget(void)
{
  static A &Obj = &new A;
  return Obj;
}    使用方法如下:      Aobj.Func2(2);
  int d = Aobj.Func1();    只有在第一次使用 Aobj 會真正建立物件,往後都
使用同一個物件,這樣使用 Aobj 就好像事先已建好了
全域物件一樣,也不擔心建立的順序間題    果然是高手,一出手就讓人嚇一跳    
發表人 - jackyung 於 2005/02/27 22:44:09
pwipwi
版主


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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-03-06 13:40:58 IP:211.76.xxx.xxx 未訂閱
上面的程式碼有memory leakage的問題,Obj是不會被釋放的。如果在destructor中有重要的程式碼,是不會被呼叫的...(該"高手"在reference的觀念上有一些問題) 比較標準的做法可以參考
jackyung
一般會員


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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-03-23 01:17:23 IP:218.171.xxx.xxx 未訂閱
謝謝指導,以下可以找到詳細說明 http://dev.csdn.net/Develop/article/22/22205.shtm 不過若不是要建立 singleton 的樣式,只是要有一個內定的全域物件還是得用 函數的方式吧,還得顧慮多執行緒,我得想想... 發表人 - jackyung 於 2005/03/23 01:54:57
系統時間:2024-05-19 14:42:25
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!