→ 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