推 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