精華區beta C_and_CPP 關於我們 聯絡資訊
我在寫 binary tree... 還沒寫的部份就不提了, 現在我碰到了一個關於 static 的問題 雖然我可以用很蠢的方式解決, 但是我想知道為什麼會這樣…… 謝謝各位的解答 ^^ 我的問題是這樣… 我先在主程式中 include 我的 btree.h 檔 而在這個 btree.h 中 include 兩個檔 先 include btree_item 的 interface,而這個 interface 中 再 include btree_item.cpp 的 implement btree.h include 的第二個檔自然就是 btree 主體了 這是我目前的程式架構 我不知道這樣的方式是否正確,這只是我自己想的 先不管這個 我的 btree class 中有個 btree_item pointer,叫做 root 然後我的 inorder function 這樣寫 void LVR(btree_item<type> *temp = root); 然後我在主程式呼叫 LVR,用 myTree.LVR(); 結果 compiler 告訴我 invalid use of non-static data member `btree<int>::root' 我不懂這是什麼意思…? 這跟 static 有啥關係? 既然他都說 non-static,我乾脆把 root 改寫成 static 結果…… 造成 linking error 我投降,不知道為什麼 我想這是觀念問題吧…… debug de 不出來 我是可以把 root 改寫成 public 然後用 root 去呼叫 但是我不想這麼做…… 能告訴我該怎麼解決嗎? 感激 -- http://www.dofu.idv.tw/xoops/html http://www.godfat.idv.tw -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.138.241.159
godfat:不要告訴我這是 gcc 的 bug =口=140.138.241.159 06/19
UNARYvvv:root 原本是 non-static 就對了 61.70.137.117 06/19
UNARYvvv:會不會你的 LVR 是 static member function 呢? 61.70.137.117 06/19
UNARYvvv:然後取用到那個 non-static data member "root" 61.70.137.117 06/19
> -------------------------------------------------------------------------- < 作者: UNARYvvv (有趣生活) 看板: C_and_CPP 標題: Re: [問題] non-static? static? 時間: Sun Jun 19 15:50:32 2005 ※ 引述《godfat (godfat 真常)》之銘言: : 先不管這個 : 我的 btree class 中有個 btree_item pointer,叫做 root : 然後我的 inorder function 這樣寫 : void LVR(btree_item<type> *temp = root); : 然後我在主程式呼叫 LVR,用 myTree.LVR(); : 結果 compiler 告訴我 : invalid use of non-static data member `btree<int>::root' 感覺是因為.. 或許你的 LVR 是個 static member function?? 因為如果用 static member function 直接去存取 non-static data member 是不合法的,於是有可能出現類似錯誤訊息來 : 我不懂這是什麼意思…? : 這跟 static 有啥關係? : 既然他都說 non-static,我乾脆把 root 改寫成 static : 結果…… : 造成 linking error 因為你直接把 non-static data member 改成 static,且仍有取用它 而 class definition 外面又沒有寫 static data member initialization 例如 btree<int>::root = 0; 所以才會發生 linking error (有宣告沒定義) : 我投降,不知道為什麼 : 我想這是觀念問題吧…… : debug de 不出來 : 我是可以把 root 改寫成 public 然後用 root 去呼叫 : 但是我不想這麼做…… : 能告訴我該怎麼解決嗎? : 感激 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 61.70.137.117
godfat:expected constructor, destructor, or type conv140.138.241.159 06/19
godfat:or type conversion before '=' token140.138.241.159 06/19
godfat:放棄,這句我又看不懂了。root 是指標怎麼140.138.241.159 06/19
godfat:會有 constructor or destructor?140.138.241.159 06/19
godfat:type conversion 更是不知所云140.138.241.159 06/19
godfat:以上是如果我給 static root 定義的話140.138.241.159 06/19
> -------------------------------------------------------------------------- < 作者: godfat (godfat 真常) 看板: C_and_CPP 標題: Re: [問題] non-static? static? 時間: Sun Jun 19 16:15:50 2005 感謝回答 :D : 或許你的 LVR 是個 static member function?? 不,我沒有宣告任何 static 除非 compiler 有可能在沒寫之下把他做成 static 否則應該是不會有 static... 還是 member function 本來就是 static ?? 如果是這樣…… Orz : 因為如果用 static member function 直接去存取 non-static data member : 是不合法的,於是有可能出現類似錯誤訊息來 為什麼這樣不合法? 有辦法讓他合法嗎? : 而 class definition 外面又沒有寫 static data member initialization 那麼那麼,我如果有 definition 呢? 立刻試試看 = =+ 先假設這樣可以好了,可是我並不想寫成 static... 如果可以的話希望還是能用 non-static 的 感覺聽起來真的蠻像是我的 member funciton 變成 static 了 不過這樣應該是可以節省不少資源 所以如果預設 member function 是 static 的話 有辦法改寫成 static member function 合法存取 non-static data member? 再次感謝 -- http://www.dofu.idv.tw/xoops/html http://www.godfat.idv.tw -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.138.241.159
khoguan:你給的程式碼不足以讓人幫你診斷 :(220.130.208.166 06/19
godfat:抱歉,我是怕太長會讓人看不下去,馬上貼140.138.241.159 06/19
> -------------------------------------------------------------------------- < 作者: UNARYvvv (有趣生活) 看板: C_and_CPP 標題: Re: [問題] non-static? static? 時間: Sun Jun 19 17:32:55 2005 ※ 引述《godfat (godfat 真常)》之銘言: : 感謝回答 :D : : 或許你的 LVR 是個 static member function?? : 不,我沒有宣告任何 static : 除非 compiler 有可能在沒寫之下把他做成 static : 否則應該是不會有 static... : 還是 member function 本來就是 static ?? : 如果是這樣…… Orz 不是的 預設(沒寫 static)就是 non-static 的 如果你確定沒宣告任何 static member,那就排除這個可能了 我想問題就不在這裡了 : : 因為如果用 static member function 直接去存取 non-static data member : : 是不合法的,於是有可能出現類似錯誤訊息來 : 為什麼這樣不合法? : 有辦法讓他合法嗎? 呃.. static member function 只能直接存取 static data member 啊 因為它並不像 non-static member function 內有一個隱含的 this 指標 那個 this 指標會指向實際建立的物件 讓 non-static member function 得以知道 目前到底是在處理哪個物件的 data member 既然 static member function 沒有 this 指標 這也就是說 它並不知道目前在處理哪個物件實體 自然也不知道物件裡面的 non-static 資料囉 簡單來說 你可以把 static member function/data member 想成是 「放在 class scope 內的 global(namespace) function/varible」 通常使用 static member function 的時機是要處理 「與特定物件實體無關的工作」 而且..你的 LVR 我覺得原本是 non-static 就沒錯了不用改 : : 而 class definition 外面又沒有寫 static data member initialization : 那麼那麼,我如果有 definition 呢? : 立刻試試看 = =+ : 先假設這樣可以好了,可是我並不想寫成 static... 其實不用試啦~ 因為我提到沒 definition 只是要解釋為何會發生 linking error 而已啦 當然囉,你在寫一個 binary tree,root 本來就應該是 non-static 難不成你建立的每棵樹都要共用一個 root ?? 應該不會吧XD : 如果可以的話希望還是能用 non-static 的 : 感覺聽起來真的蠻像是我的 member funciton 變成 static 了 : 不過這樣應該是可以節省不少資源 沒有吧,其實你建立多少個同類物件 member function 都只有一份 對於 data member 才有差別 : 所以如果預設 member function 是 static 的話 : 有辦法改寫成 static member function 合法存取 non-static data member? : 再次感謝 預設 member function 不是 static (因為你沒寫 static) 以你前面的問題來說,non-static 就搞定了不是嗎 改成 static 只會增加麻煩 說了這麼多其實也沒有直接解決到你的問題^^" 如果可以的話乾脆 po 個 code 上來吧^^" -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 61.70.137.117 > -------------------------------------------------------------------------- < 作者: godfat (godfat 真常) 看板: C_and_CPP 標題: Re: [問題] non-static? static? 時間: Sun Jun 19 17:35:27 2005 重點程式碼…… 這邊是樹的 class template <typename type> class btree{ public: btree(type); ~btree(); void insert(type&); bool remove(type&); btree_item<type>* search(type&, btree_item<type>* loc, btree_item<type >** parent); void LVR(btree_item<type>*); void VLR(btree_item<type>*); void LRV(btree_item<type>*); // 有空的話再改寫成迴圈版 btree_item<type>* get_root(void); // invalid use of non-static data member? private: btree_item<type> *root; // ^^^^ 就是這個 root }; 呼叫處 myTree.LVR(); LVR 定義處 template <typename type> void btree<type>::LVR(btree_item<type> *temp = root){ // ^^^^ // 這邊只要用到就會出現那個錯誤 // 不管是哪個 member function 都一樣 // 忘了提,想用 this->root 錯誤說不能用 if(temp->get_left()) LVR(temp->get_left()); std::cout << temp->get_data() << ' '; if(temp->get_right()) LVR(temp->get_right()); } -- http://www.dofu.idv.tw/xoops/html http://www.godfat.idv.tw -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.138.241.159 ※ 編輯: godfat 來自: 140.138.241.159 (06/19 17:36)
UNARYvvv:用 this->root 錯誤寫什麼? 61.70.137.117 06/19
UNARYvvv:要不要順便連相關的一些錯誤訊息都po一下呢~ 61.70.137.117 06/19
godfat:忽然一堆人找,抱歉等一下 @@140.138.241.159 06/19
godfat:`this' may not be used in this context140.138.241.159 06/19
godfat:等一下我 po 簡略版的 code140.138.241.159 06/19
> -------------------------------------------------------------------------- < 作者: godfat (godfat 真常) 看板: C_and_CPP 標題: Re: [問題] non-static? static? 時間: Sun Jun 19 18:06:55 2005 : 如果你確定沒宣告任何 static member,那就排除這個可能了 : 我想問題就不在這裡了 了解,謝謝 : 你可以把 static member function/data member 想成是 : 「放在 class scope 內的 global(namespace) function/varible」 感謝你的詳細解說 雖然我覺得我頭上還是冒出很多問號 XD 畢竟我連 static data member 都很少用了, static member function 更是完全沒碰過 搞不懂這樣說起來的話 static member function 有啥意義… : 當然囉,你在寫一個 binary tree,root 本來就應該是 non-static : 難不成你建立的每棵樹都要共用一個 root ?? 應該不會吧XD 因為這次的需求只要一棵樹,所以我想如果 static 能解決的話也沒差 XD : 沒有吧,其實你建立多少個同類物件 : member function 都只有一份 : 對於 data member 才有差別 咦,那 static member function 有啥用? 反正大家都只有一份不是嗎? : 以你前面的問題來說,non-static 就搞定了不是嗎 有搞定嗎? XD 他不讓我預設引數啊 :( : 如果可以的話乾脆 po 個 code 上來吧^^" 其實我是怕太長讓人看不下去所以才沒 po 想說直接問看看能不能有答案… 畢竟其他地方我覺得應該沒什麼問題 不過現在因為我在寫移除節點,結果發現某個不方便 目前正在改寫 tree_item 結構…… 整個 code 還很亂 待我整理一下 po 出時也只 po 重點就好 ^^ -- http://www.dofu.idv.tw/xoops/html http://www.godfat.idv.tw -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.138.241.159 > -------------------------------------------------------------------------- < 作者: leeya (MS go) 看板: C_and_CPP 標題: Re: [問題] non-static? static? 時間: Sun Jun 19 18:21:17 2005 ※ 引述《godfat (godfat 真常)》之銘言: : 重點程式碼…… : 這邊是樹的 class : template <typename type> : class btree{ : public: : btree(type); : ~btree(); : void insert(type&); : bool remove(type&); : btree_item<type>* search(type&, btree_item<type>* loc, btree_item<type : >** parent); : void LVR(btree_item<type>*); void LVR(btree_item<type>*t = root); : void VLR(btree_item<type>*); : void LRV(btree_item<type>*); : // 有空的話再改寫成迴圈版 : btree_item<type>* get_root(void); : // invalid use of non-static data member? : private: : btree_item<type> *root; : // ^^^^ 就是這個 root : }; : 呼叫處 : myTree.LVR(); : LVR 定義處 : template <typename type> : void btree<type>::LVR(btree_item<type> *temp = root){ 我沒看過這種寫法, 一般不都給常數當初始值嗎? void btree<type>::LVR(btree_item<type>*temp){ : // ^^^^ : // 這邊只要用到就會出現那個錯誤 : // 不管是哪個 member function 都一樣 : // 忘了提,想用 this->root 錯誤說不能用 : if(temp->get_left()) : LVR(temp->get_left()); : std::cout << temp->get_data() << ' '; : if(temp->get_right()) : LVR(temp->get_right()); : } 試看看改這樣行不行 不行的話再試下面的 class void LVR(btree_item<type>*t = 0); void btree<type>::LVR(btree_item<type>*temp){ if (!temp) temp = root; // .... } 有錯誤請指教 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 211.75.159.136
khoguan:我想到的也是這種解法 :)220.130.208.166 06/19
> -------------------------------------------------------------------------- < 作者: godfat (godfat 真常) 看板: C_and_CPP 標題: Re: [問題] non-static? static? 時間: Sun Jun 19 18:36:07 2005 : 我沒看過這種寫法, 一般不都給常數當初始值嗎? @@ 有這種事? 原來預設值不能給變數喔? 剛剛查了一下我之前寫的 發現是 template 做出來的常數 -_-b 我一直以為可以用變數 : 試看看改這樣行不行 不行,結果一樣 : void LVR(btree_item<type>*t = 0); : void btree<type>::LVR(btree_item<type>*temp){ : if (!temp) temp = root; 這個可以 XDDD 可是有繞一圈的感覺…… Anyway,介面一樣就好了 @@ 一點效率差應該沒關係(再追究下去什麼都別做了……) 感激,這個方法可解 XD 可是為什麼預設值不能給變數? 有什麼結構上的考量嗎? 感謝感謝… 那 code 應該不用整理了? XD -- http://www.dofu.idv.tw/xoops/html http://www.godfat.idv.tw -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.138.241.159
leeya:原因就請高手解釋吧...因為我也不確定@@ 211.75.159.136 06/19
> -------------------------------------------------------------------------- < 作者: UNARYvvv (有趣生活) 看板: C_and_CPP 標題: Re: [問題] non-static? static? 時間: Sun Jun 19 18:49:52 2005 ※ 引述《godfat (godfat 真常)》之銘言: : : void LVR(btree_item<type>*t = 0); : : void btree<type>::LVR(btree_item<type>*temp){ : : if (!temp) temp = root; : 這個可以 XDDD : 可是有繞一圈的感覺…… : Anyway,介面一樣就好了 @@ : 一點效率差應該沒關係(再追究下去什麼都別做了……) 不想寫判斷是否是root的話,也可以改寫成兩個函式吧 一個是 public 一個 private 類似 public: void LVR() { LVR(root); } private: void LVR(btree_item<type> *t) { /*...*/ } 因為我覺得提供給外界呼叫的介面 若還提供傳入 root 位址 (即使有提供參數預設值) 怪怪的,因為那是 tree 內部該自己處理好的事情.. 假如class使用者傳入一個不可使用的位址..程式可能就掛了 看到你的 class 有寫一個 btree_item<type>* get_root(void); 原本對外界來說,root 是不可見的資料吧 呼叫 LVR 的時候 無法由外界直接取得那個屬於該 tree 的 data member "root" 來傳入 (限以正常手段) 不過既然你有提供這個函式,那的確是可以從外界取得 root ... 但還是不夠安全(上一段我講的) 以你原來的設計來說,還真是只能傳個東西進去再做額外判斷... -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 61.70.137.117 ※ 編輯: UNARYvvv 來自: 61.70.137.117 (06/19 19:00) > -------------------------------------------------------------------------- < 作者: UNARYvvv (有趣生活) 看板: C_and_CPP 標題: Re: [問題] non-static? static? 時間: Sun Jun 19 19:13:25 2005 ※ 引述《godfat (godfat 真常)》之銘言: : 可是為什麼預設值不能給變數? : 有什麼結構上的考量嗎? "結構上"的考量~?????~XD 總之 member function 的參數若是要用 "變數" 作為預設值 該變數必須被宣告為 static 可以試驗一下下面 code #include <iostream> using std::cout; using std::endl; class a { public: a(){} void show1(int i=x) { cout<<i<<endl; } // ok~ static show2(int i=x) { cout<<i<<endl; } // ok~ // void show3(int i=y) { cout<<i<<endl; } // wrong!! private: static int x; int y; }; int a::x=99; // static data member initialization int main(){ a().show1(); // call non-static member function a::show2(); // call static member function return 0; } -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 61.70.137.117 ※ 編輯: UNARYvvv 來自: 61.70.137.117 (06/19 19:14) > -------------------------------------------------------------------------- < 作者: godfat (godfat 真常) 看板: C_and_CPP 標題: Re: [問題] non-static? static? 時間: Sun Jun 19 19:34:29 2005 : 不想寫判斷是否是root的話,也可以改寫成兩個函式吧 : 一個是 public 一個 private : 類似 : public: : void LVR() { LVR(root); } : private: : void LVR(btree_item<type> *t) { /*...*/ } 有道理 overload 一個參數是 void 的 function 就好了 我怎麼沒想到…… Orz 不過寫成我原本那個樣子是有另一個考量,後述 : 因為我覺得提供給外界呼叫的介面 : 若還提供傳入 root 位址 (即使有提供參數預設值) 因為我還有定義一個 search(type) method 找到最接近的值,傳回地址 如果說使用者想拜訪從某個點開始的話… myTree.LVR(myTree.search(MATCHING_DATA)); 話說回來,這樣一想把 LVR 定義成 method 好像有點多餘 這時候就可以用 static...? btree::LVR(myTree.search(MATCHING_DATA)); 這樣看起來就簡潔多了 不過好像又會碰到 static 不能讀 non-static XD 看來不要寫在 class 裡也許是最好的選擇… : 假如class使用者傳入一個不可使用的位址..程式可能就掛了 不知道有沒有辦法檢查 pointer 的目標型別? 如果可以的話,我想可以做處理…應該不至於會掛掉 不過我不知道可不可以 @@ : 看到你的 class 有寫一個 : btree_item<type>* get_root(void); 這個是因為我之前一直碰到那個 non-static 的問題 為了這個問題所以我才寫這個的 現在可以刪掉了… ^^b : 無法由外界直接取得那個屬於該 tree 的 data member "root" 來傳入 我的想法是透過 search 來取得某個位置的資料 不過仔細想想這東西好像也不該寫在 class 裡…? : 但還是不夠安全(上一段我講的) : 以你原來的設計來說,還真是只能傳個東西進去再做額外判斷... 老實說我程式一直是自修的 所以我寫的很多地方想必看起來會很怪 我現在回頭去看以前我寫的東西也是… 一直不斷在嘗試新的寫法,同時也一直會碰到很多問題 我手上的書也還沒看完… 也因為如此,所以近期可能打算找找看有沒有什麼 programming style 的書 謝謝 :D -- http://www.dofu.idv.tw/xoops/html http://www.godfat.idv.tw -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.138.241.159
UNARYvvv:加油~我也是自修的 你可以買本 C++ Primer 來K~ 61.70.137.117 06/19
godfat:正是 C++ Primer 看一半 XD ~ 呵呵140.138.241.159 06/19
khoguan:自學程式的人往往更有熱情 :-)220.130.208.166 06/19
godfat:you're right, hahaha XD140.138.241.159 06/19
> -------------------------------------------------------------------------- < 作者: khoguan (Khoguan Phuann) 看板: C_and_CPP 標題: Re: [問題] non-static? static? 時間: Sun Jun 19 19:47:36 2005 ※ 引述《UNARYvvv (有趣生活)》之銘言: : ※ 引述《godfat (godfat 真常)》之銘言: : : 這個可以 XDDD : : 可是有繞一圈的感覺…… : : Anyway,介面一樣就好了 @@ : : 一點效率差應該沒關係(再追究下去什麼都別做了……) : 不想寫判斷是否是root的話,也可以改寫成兩個函式吧 : 一個是 public 一個 private : 類似 : public: : void LVR() { LVR(root); } : private: : void LVR(btree_item<type> *t) { /*...*/ } 照原po的需求,可以考慮將這兩個 overloaded function 都放在 public: 區, public: void LVR() { LVR(root); } void LVR(btree_item<type> *t) { /*...*/ } 這樣從外部呼叫時,若用 myTree.LVR(); 就是call第一個版本, 第一個版本會再轉call第二個版本。但若是用 myTree.LVR(ptr); 就是直接call第二個版本。 這種做法,既可達到原來的需求,也不會有overhead. 第一種版本 雖是轉call, 但因為是 inline 所以沒差。 : 因為我覺得提供給外界呼叫的介面 : 若還提供傳入 root 位址 (即使有提供參數預設值) : 怪怪的,因為那是 tree 內部該自己處理好的事情.. 嗯,參數那邊是對外的介面,就像家門外的階梯一樣, 而內部資料成員,尤其是 private 的,就像閨房內的 害羞物一樣,擺放到門外邊,當然是不成體統的 ;-Q 總之,預設引數不能是 non-static data member。 不過,預設引數值不限於常數,而可以使用執行時期 才算出其值的 expression, 例如執行另外一個函式的return value. #include <cstdlib> int func(int x, int y = rand()) { return x + y; } : 假如class使用者傳入一個不可使用的位址..程式可能就掛了 : 看到你的 class 有寫一個 : btree_item<type>* get_root(void); : 原本對外界來說,root 是不可見的資料吧 : 呼叫 LVR 的時候 : 無法由外界直接取得那個屬於該 tree 的 data member "root" 來傳入 : (限以正常手段) : 不過既然你有提供這個函式,那的確是可以從外界取得 root ... : 但還是不夠安全(上一段我講的) : 以你原來的設計來說,還真是只能傳個東西進去再做額外判斷... -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 220.130.208.166
godfat:沒錯,我現在就是用上面那方法改寫140.138.241.159 06/19
godfat:只怪我忘記 overloading 了 @_@140.138.241.159 06/19
godfat:後者我懂了,感謝感謝,以後會注意 ^^b140.138.241.159 06/19
> -------------------------------------------------------------------------- < 作者: godfat (godfat 真常) 看板: C_and_CPP 標題: Re: [問題] non-static? static? 時間: Sun Jun 19 19:42:01 2005 : "結構上"的考量~?????~XD 比方說如果可以存取變數的話會發生什麼可怕的事? XD : 總之 member function 的參數若是要用 "變數" 作為預設值 : 該變數必須被宣告為 static 原來如此 所以 compiler 才告訴我 invalid use of non-static data member... 可是為什麼要這樣設計? =口= : 可以試驗一下下面 code : #include <iostream> : using std::cout; : using std::endl; : class a { : public: : a(){} : void show1(int i=x) { cout<<i<<endl; } // ok~ : static show2(int i=x) { cout<<i<<endl; } // ok~ : // void show3(int i=y) { cout<<i<<endl; } // wrong!! 為什麼?跟最佳化有關嗎? 存取了一般 data member 會影響效率? : private: : static int x; : int y; : }; : int a::x=99; // static data member initialization 順便問個問題…為什麼不能在 class 內部初始化? 這個初始化會在什麼時候執行?執行到這一行的時候嗎? : int main(){ : a().show1(); // call non-static member function 不太懂這是什麼意思… 可以在 object 還沒建立出來前就呼叫 member function? : a::show2(); // call static member function : return 0; : } -- http://www.dofu.idv.tw/xoops/html http://www.godfat.idv.tw -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.138.241.159
UNARYvvv:要問"為什麼"..我所學不多,也不知道為什麼~ 61.70.137.117 06/19
godfat:原來如此,依然感謝 :D140.138.241.159 06/19
> -------------------------------------------------------------------------- < 作者: UNARYvvv (有趣生活) 看板: C_and_CPP 標題: Re: [問題] non-static? static? 時間: Sun Jun 19 20:00:06 2005 ※ 引述《godfat (godfat 真常)》之銘言: : : private: : : static int x; : : int y; : : }; : : int a::x=99; // static data member initialization : 順便問個問題…為什麼不能在 class 內部初始化? 只有 static constant data member 才能在 class 內部初始化 所以你要是寫 static const int x=99; 就可以過 : 這個初始化會在什麼時候執行?執行到這一行的時候嗎? 試試吧~ class b{ public: b(){ cout<<"b ctor"<<endl; } }; class a { public: static b b0; }; b a::b0; int main(){ cout<<"enter main"<<endl; return 0; } : : int main(){ : : a().show1(); // call non-static member function : 不太懂這是什麼意思… : 可以在 object 還沒建立出來前就呼叫 member function? 上面那個可拆成兩個步驟 a tmpa; tmpa.show1(); : : a::show2(); // call static member function : : return 0; : : } -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 61.70.137.117
godfat:got it, 待我把該做的做完就來試試 @@140.138.241.159 06/19