精華區beta C_and_CPP 關於我們 聯絡資訊
※ 引述《bgcrwf (老王)》之銘言: : 最近在看程式碼的時候 有看到一段搞不懂 : if (this) { : // blah.... : } else { : // blah.... : } : 想請教各位 : 在什麼情況下程式會進到else這個區塊來呢?? : 想很久想不出來 : 謝謝 像這樣的情況就會是哩: A *a = NULL ; a->f() ; 這樣 a::f() 裡面拿到的 this 就是 NULL。 會這樣設計的原因, 可以參考一個叫做 "Null Pointer(Object) Pattern" 的手法。 -- To iterate is human, to recurse, divine. 遞迴只應天上有, 凡人該當用迴圈.   L. Peter Deutsch -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 118.160.116.159
bgcrwf:這樣不會coredump嗎? 03/27 16:53
yoco315:你可以試試看阿 :D 03/27 16:56
bgcrwf:謝謝你 我還是先看完 Null Pointer Pattern 好了 03/27 17:08
bgcrwf:說不定看完就懂了 XD 03/27 17:09
james732:原來有這種用法 太神奇了 XD 03/27 17:36
LPH66:唔..比起直接丟 NULL 進去好像常見的還是丟個什麼事都不做的 03/27 18:26
LPH66:object 進去的樣子 (我是說 Null Object Pattern) 03/27 18:26
bgcrwf:不好意思 這邊不會當掉是因為沒用到this的資料嗎? 03/27 18:40
bgcrwf:在這種情況下 不能用class的non-static資料 是嗎?? 03/27 18:43
firose:沒錯 03/27 18:56
fragileness:那這樣是不是表示我們在寫member function的時候 03/27 19:16
fragileness:都應該要檢查this指標 03/27 19:16
fragileness:因為好像沒辦法阻止使用者寫 A *a = NULL;a->f(); 03/27 19:16
hexen2:如果f()是static function呢? 03/27 20:15
dendrobium:static member function 沒有 this ... 03/27 20:27
VictorTom:推一下, 以前都沒注意到這個@_@" 03/28 00:41
loveme00835:推推~ 03/28 07:08
> -------------------------------------------------------------------------- < 作者: elefant () 看板: C_and_CPP 標題: Re: [問題] this 在什麼情況下會等於NULL?? 時間: Sun Mar 28 23:17:14 2010 ※ 引述《yoco315 (眠月)》之銘言: : ※ 引述《bgcrwf (老王)》之銘言: : : 最近在看程式碼的時候 有看到一段搞不懂 : : if (this) { : : // blah.... : : } else { : : // blah.... : : } : : 想請教各位 : : 在什麼情況下程式會進到else這個區塊來呢?? : : 想很久想不出來 : : 謝謝 : 像這樣的情況就會是哩: : A *a = NULL ; : a->f() ; : 這樣 a::f() 裡面拿到的 this 就是 NULL。 : 會這樣設計的原因, : 可以參考一個叫做 "Null Pointer(Object) Pattern" 的手法。 就[Refactoring]這本書裡提及的Null Object Pattern 感覺和你提到的目的相反耶 Null Object就是不想"一直檢查是否為null" 才會創造一個虛無的object出來 還是說我有哪個地方誤會了? -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 203.70.99.205 ※ 編輯: elefant 來自: 203.70.99.205 (03/28 23:18)
tkcn:我也有同樣的疑問 @@ 03/28 23:38
loveme00835:嗯, 我也翻了一下資料, 它應該是"do nothing", 而不是 03/29 01:18
loveme00835:"is nothing" 03/29 01:18
aecho:就我所理解的…objective C裡為null時~~ 03/29 09:47
aecho:呼叫的methods幾乎都是do nothing 03/29 09:48
aecho:能直接判斷this是否為null,然後讓他do nothing,很方便呀。 03/29 09:49
softwind:ctor 直接用null obj作init 把所有method都導到 03/30 03:11
softwind:do nothing 這樣 是這個pattern的意思嗎? 03/30 03:11
aecho:像length的do nothing回傳0,而回傳pointer的都會回傳null。 03/30 12:55
aecho:void的method不做事,而description則是回傳(null)字串… 03/30 12:56
aecho:do nothing與該類別的行為有關係吧~~ 03/30 12:57
loveme00835:回傳pointer的可以回傳Null object的位址, 再用多型do 03/31 04:18
loveme00835: nothing吧? 03/31 04:18
> -------------------------------------------------------------------------- < 作者: yoco315 (眠月) 看板: C_and_CPP 標題: Re: [問題] this 在什麼情況下會等於NULL?? 時間: Fri Apr 2 20:50:34 2010 ※ 引述《elefant ()》之銘言: : : 會這樣設計的原因, : : 可以參考一個叫做 "Null Pointer(Object) Pattern" 的手法。 「原因」啦 T_T 用來解決同一個問題,但是手法不一樣。 : 就[Refactoring]這本書裡提及的Null Object Pattern : 感覺和你提到的目的相反耶 : Null Object就是不想"一直檢查是否為null" : 才會創造一個虛無的object出來 : 還是說我有哪個地方誤會了? 應該沒誤會 O_O Null Object 的確是為了不想一直檢查 null, 不過我自己是覺得應該是要用在下面這種地方, 舉個例子,假設我寫了一個線上模擬城市的遊戲, 每個玩家的城市都有上下左右四個鄰居,如果我要計算鄰居人口的總和, ┌────────────────────────────────────┐ size_t all_neighbor_population() {size_t sum = 0 ;if (_left != NULL) sum + _left ->population() ;if (_right != NULL) sum + _right->population() ;if (_up != NULL) sum + _up ->population() ;if (_down != NULL) sum + _down ->population() ;return 0 ;}└────────────────────────────────────┘ 如果用了 Null Object 的話,就可以這樣寫 ┌────────────────────────────────────┐ size_t all_neighbor_population() {return _left ->population() +_right->population() +_up ->population() +_down ->population() ;}└────────────────────────────────────┘ Null Object Pattern 使用的原因在於: 「對於 null 的 object,其 member function 有適合的預設值」 像這樣的狀況,我們就可以不用先檢查 if ( obj != NULL ), 而可以直接呼叫 obj->func() 來取得結果。 要實現這件事,有兩個方法: a. 可以像 design pattern 裡面講的,用繼承的方式作到, b. 也可以在 member function 裡面檢查 this 來作到。 那什麼狀況下我們會需要用到第一種方法? 有沒有發現很奇怪,明明第二種方法有明顯的好處: 1. 實作更簡單:直接 if 就好了,省去撰寫整個 NullClass。 2. 效能更好:因為免去了 virtual function 的呼叫成本,還可以 inline! 那為什麼會有需要第一種狀況?為什麼書上會寫第一種方法? 因為 Java 會在呼叫的當下檢查 Null,所以 Java 只能用 a。 XD 很多人看到 if (this) 都覺得很奇怪這樣不會 core dump 嗎? C++ 的確不會 core dump,但是 Java 會 NullPointerException,哈哈哈, 這邊在 C++ 只是單純的跳到那個 member function 的位置去繼續執行, 一直到程式碼去存取 data member 的時候才會發生 invalid access。 但是 Java 會在 member function 呼叫的當下進行指標的檢查(揪甘心ㄟ), (新一版 Java 終於有語法可以避開 NullPointerException 啦~!) 所以如果 this 是 null,Java 當下就給你一個 exception,黯然回首。 一個觀點是 Design Pattern 的存在是因為語言本身的不足。 正因為語言沒有提供這個功能,所以我們透過 Design Pattern 去作到某些事, 比方說沒有 multi-method 的語言會要用到 visitor 去模擬, 或是沒有 multiple inhertance 的語言會去用 adaptor/decorator 模擬。 話說 Design Pattern 發展最蓬勃的時候剛好也是 Java 最流行的時候 XD 真巧。(我沒有說 Java 很不足,這是別人說的 XD) -- To iterate is human, to recurse, divine. 遞迴只應天上有, 凡人該當用迴圈.   L. Peter Deutsch -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 118.160.115.202
PsMonkey:C++ 只應天上有,凡人該當用 Java -- PsMonkey [核爆] 04/02 21:25
remmurds:其實這篇也某種程度反映出C++仍有很多不足的地方 04/02 21:29
yoco315:沒錯, 所謂的 Effective C++ 其實是 Defective C++ XD 04/02 21:46
Bencrie:這個 syntax highlight theme是 ... Turbo C++ v3 XD? 04/02 22:08
VictorTom:還是C語言比較和藹可親一點....XD 04/02 22:10
sbrhsieh:提到的 C++ case 是 non-virtual function call, 嚴格說 04/02 22:21
sbrhsieh:跟 Java case 的意義不完全一樣。 04/02 22:21
yoco315:對阿 tc3 04/02 22:27
littleshan:雖然對java有酸到 但我還是笑了 XD 04/02 23:11
yoco315:這真的不是我說的 XD 是前幾天在別的地方看到的 XD 04/02 23:49
legendmtg:前幾天我好像也有看到XD 04/03 00:04
holymars: 推薦這篇文章 04/03 00:05
zha0:推顏色 04/03 00:26
tomap41017:哈哈哈是C老師的梗嗎?XD 04/03 02:52
bobhsiao:第一個藍色方塊,裡面應該是 sum "+=" 吧? 04/04 00:47