java 板


LINE

很久沒寫點什麼了(或是說都沒貼過來),就在 java 板講點 c++ 的廢話吧... @_@b 當然也只是一些個人的理解就是了... ※ 引述《PsMonkey (痞子軍團團長)》之銘言: : 而 c++ 似乎沒有這樣分,反正 method 有在 class 宣告就好 : 有沒有在 class 裡頭 define 沒關係,也許某個檔案的某個角落就有實做 : 你必須自己去尋找、分辨 : 我是不知道 c++ 這樣作有什麼好處, : 也許高手可以用這個模糊地帶玩出一些方便開發的優點 : 我是懶惰的遜咖,害怕這種事情... 其實這樣做的原因很多,並不單單只是因為「好」或是「習慣」。 就像我在前幾篇的推文提到的,這樣作比較大的原因是來自 compilation model. 由於 c/c++ 遠比 java 靜態,他在編譯的時候就需要各個 class/function 的 原始資料,也就是 source code. 然而我們需要的其實只有 declaration, 並不需要 definition. 所以很自然地就把 declaration 放在 header, 並讓其他 source code 去 include 進來。也就是說,每個 compilation unit 都會需要所有用到的 class/function 的 declaration. (不過其實 class header 就已經是 class definition 了,但這邊先不分這麼細) 於是當我們提供自己的 library 時,可以提供 binary + header 即可, 對方可以完全不用看到實作細節到底是怎麼樣。這樣一來可以隱藏實作細節, 二來有人不想 open source 卻要作 library, 就能用這種方式。 然而 java 這部份的資料完全是動態載入的,所以就不需要 header, 更不會有恐怖的 circular dependency? 其實我不確定,java 不常寫 @_@ 不過剛剛試了一下,確實可以搞出有趣的東西... a.java: class A{ B b; } b.java: class B{ A a; int d; } 這樣一開始是沒辦法編譯的,但是可以先把 class A 的 B b; 拿掉, 隨便做出個錯誤的 A.class, 接著 compile b.java, 再把 a.java 加回 B b; 並編譯。 另外寫了個 c.java: class C{ public static void main(String[] argv){ A a = new A(); B b = new B(); a.b = b; b.a = a; a.b.a.b.d = 10; System.out.println(b.a.b.a.b.d); } } 這樣剛剛測試是可以跑出 10 的... 小實驗中沒問題,大程式這樣會不會掛我就不知道了...? 有請熟悉 java compilation model 的 @_@b 而在 c/c++ 中理所當然不能搞這種事,因為 header 就等於是 spec, 如果讓兩個 binary 中得到的資訊不同,我想程式在 runtime crash 掉的可能性很高 於是有了 forward declaration 與 declaration 和 definition 分離這兩件事, 使得可以寫成這樣: a.h: #ifndef _A_H_ #define _A_H_ class B; // 宣告,沒有定義 class A{ public: B* b; void f(); // 宣告,沒有定義。因為如果在這定義,不能使用還沒定義的 B! }; #endif b.h: #ifndef _B_H_ #define _B_H_ class A; class B{ public: A* a; int d; }; #endif 而這同時也是因為 #include 只是作 text 上的處理,不是什麼模組化的東西。 當然不可能在 a.h 去 include b.h 然後 b.h 又去 include a.h... 所以至少 A 或 B 其中一個一定會看不到對方真正的「定義」。 但是如果「宣告」和「定義」分離了,那麼就能讓 A 和 B 互相使用對方的東西... 這跟 OO 無關,也不是說宣告和定義分離會特別好用,只是 c/c++ 的 compilation model 需要這種分離才能做到某些事情。如果沒有碰到上面那種事情, 要全部的東西都寫在 header 也不是不行,小心 multiple definition 就好了。 也就是說 c++ 其實沒什麼良好的模組化能力。有人在 c++0x, 也就是下一版的 c++ 中提出相關的 proposal, 我沒記錯的話是沒有通過的。原因我想很簡單, 這影響層面太大了.... 而 09 年又只是明年 XD 另一方面,如果你「信任」對方的話,只看宣告和文件也會比看到一堆定義來得清楚。 雖然說其實現在編輯器這麼強大,要把所有定義 fold 起來,讓 *.java 看起來像 *.h 那樣只有宣告的「樣子」,也不是什麼大問題... btw, 如果再談到 c++ template, 那情況就會變得很恐怖了。恐怖在於原本的宣告和 定義分離,某種程度上會無法作用。這時候就要靠只有 comeau 實作的 export 了... 然後其他 c++ compiler 全部都會無法編譯... 除非要手動去 instantiate... 越靜態的東西,編譯起來就越麻煩... -- 生死去来、棚頭傀儡、一線断時、落落磊磊 《花鏡》-世阿弥 --



※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 220.135.28.18
1F:推 Fightsea:又多學到了一些東西! 03/28 12:49
2F:推 wctang:這篇寫得好,早看到我就不用多嘴了 :) 03/28 18:28
3F:推 wctang:現實上要共用的東西都不該弄成C++的形式,問題太多了 03/28 18:34
4F:→ wctang:除非是 open source 的型式... 03/28 18:37







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:BuyTogether站內搜尋

TOP