作者Favonia (小西風最乖了*^^*)
看板C_and_CPP
標題Re: [問題] this 在什麼情況下會等於NULL??
時間Sun Jul 24 00:12:05 2011
yoco315 大的實作好像有點怪怪的...
(兩篇一起回)
※ 引述《yoco315 (眠月)》之銘言:
: 像這樣的情況就會是哩:
: A *a = NULL ;
: a->f() ;
: 這樣 a::f() 裡面拿到的 this 就是 NULL。
C++ 裡面是應該是未定義。
(標準沒有 200% 清楚的寫出來,不過
我相信這是沒有爭議的解讀法!)可以執行純粹是編譯器剛好這樣做。
主要是因為 a->f()
差不多相當於 (*a).f()
: 會這樣設計的原因,
: 可以參考一個叫做 "Null Pointer(Object) Pattern" 的手法。
: 推 LPH66:唔..比起直接丟 NULL 進去好像常見的還是丟個什麼事都不做的 03/27 18:26
: → LPH66:object 進去的樣子 (我是說 Null Object Pattern) 03/27 18:26
Null Object Pattern 的精神是塞一個有相同介面,但完全不做事
的物件。故意不用語言內建空指標,是因為空指標可能會帶來無窮的災
難,然後自己寫的物件不會。所以如 LPH66 大指出,還是另外自己建一
個物件吧。
※ 引述《yoco315 (眠月)》之銘言:
: 很多人看到 if (this) 都覺得很奇怪這樣不會 core dump 嗎?
: C++ 的確不會 core dump,但是 Java 會 NullPointerException,哈哈哈,
: 這邊在 C++ 只是單純的跳到那個 member function 的位置去繼續執行,
: 一直到程式碼去存取 data member 的時候才會發生 invalid access。
這比較像編譯器逆向工程,跟 C++ 本身沒有絕對的關係 orz(因為
這個版討論主題的關係我就把 Java 部份刪掉了...)
(我個人覺得 Java
還是離理想差很遠 xD...)
其實就連編譯器逆向工程恐怕都有點危險。我相信如果是 virtual
function 大部分實作都需要看一下 this.
: 一個觀點是 Design Pattern 的存在是因為語言本身的不足。
: 正因為語言沒有提供這個功能,所以我們透過 Design Pattern 去作到某些事,
非常同意這點。我甚至可以說現在很多設計模式,都只是因為常見
物件導向語言很多難用的地方。然後它們也沒有完全解決問題 orz
---
註:Wikipedia 真的是什麼怪東西都有...
http://en.wikipedia.org/wiki/Null_Object_pattern
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.112.30.39
※ 編輯: Favonia 來自: 140.112.30.39 (07/24 05:42)
推 legnaleurc:Null Object pattern 有什麼奇怪的? 07/24 14:52
哈因為我見識淺薄,之前不知道有很多人把這個當一個設計模式在談。
※ 編輯: Favonia 來自: 140.112.30.39 (07/24 18:22)
推 aecho:null object pattern在obj-C裡真的是丟nil (NULL)進去 @@ 07/24 18:23
推 aecho:直接從語言特性上支援這個pattern 07/24 18:26
→ firejox:那還是用C好了... 當a是NULL時 a->f()會科科XD 07/24 23:03