發信人tinlans.bbs@whshs.cs.nccu.edu.tw (汀),
看板Programming
標 題Re: [推廣]Ultimate++ - Free C++ GUI Framework
發信站政大狂狷年少 (Sat Jul 29 11:35:42 2006)
轉信站ptt!ctu-reader!ctu-gate!news.nctu!news.nsysu!news.isu!News.a6Crazy.twb
※ 引述《march20.bbs@ptt.cc》之銘言:
> RTTI 不支援是 C++ 的錯, 不是 wx 的錯 :P
> 如果 C++ 像 java 一樣有個 root class (i.e java.lang.Object), RTTI 會簡單很多.
> 沒有這種 construct, RTTI 只能靠 macro 變出來, 會髒到不行. (MFC 就這樣搞的)
不知道你說的是哪種 RTTI 特性?
C++ 目前屬於 RTTI 的只有 dynamic_cast<> 和 typeid,
不過會用上這兩項 RTTI 機制本身其實就是 OO 裡的骯髒解法,
因為會在分散的地方出現重複的 if else 或 switch case,
這一點是 OO 所不推崇的,
雖然說現實上每件專案還是碰得上三四處非用不可的地方。
至於類似 java.lang.Object 這種東西可以自己打造一套 class hierarchy,
然後為 primtive types 製作 wrapper classes,
不過我倒是不清楚這跟 RTTI 的關聯性,
當然 C++ 是沒辦法像 Java 那樣可以動態抓 method name 還拿來用,
只是這種功能倒也不是有其必要性。
> 不然就得改 C++ 語法, 這麼一來很多 C++ compiler 就不支援 wx 了.
> (用 "root class" 怪怪的, 有什麼 term 可以用嗎? 很久沒碰 Programming Language 了)
> generic type (在 C++ 來說就是 template 啦) 有其方便性,
> 但一般來說, 有了 RTTI 和 root class 後, template 就可以拿掉了,
> 就算有, 也只是 syntax sugar, 這就是 java 沒有 template 但卻沒什麼人抗議的原因.
C++ 在 OO design patterns 上的實作跟純 OOPL 之所以有很大的不同,
就是在於 template 上,
目前的 Java 雖然以 dynamic instantiate 支援了 template,
但是卻無法獲得在 C++ 上用 template 換來的效率,
不但真的只是 syntax sugar 而且還賠掉 CPU time 跟 memory space,
而 C++ 用上 template 實作的好處是用 memory space 換 CPU time。
實際在運用 OO design patterns 撰寫軟體系統時,
可以視軟體在「變化」和「效能」上的需求,
選擇使用靜態多型的 template 還是動態多型,
兩者在實現 design patterns 時都能達到設計 protocol based 機制的目的,
code 同樣都是寫:
XXX->foo(args);
但是卻有完全不同的時空間佔用量。
在選擇方面,
如果這段程式碼的行為改變完全由 user 控制,
也就是在 runtime 由 user 利用 UI 改變 XXX 的類型,
而且 XXX 有可能是在 runtime 才掛上來的新東西,
在 compile-time 有可能無法預知的,
就無法使用 template;
但是如果這段程式碼的行為改變是取決於 programmer,
只是為了將來在程式裡面加入新 class 不必改東改西還搞出一堆 bug,
那麼就可以很快樂的使用 template,
使用 template 的另一個好處就是每個 XXX 所屬的 class,
並不需要都具有共通的 ancestor class,
在 programming 的活性上有非常大的幫助。
> (well, 不過 "建議" 要有 generic type 的人 應該是不少,
> Java 1.5 已經把 generic type 加到 java 的語法裡了.
> 雖然沒有沒關係, 但有了大家都很高興, 這就叫 syntax "sugar" :P)
> 在沒有 RTTI 和 root class 時, template 就像是 syntax level 的 macro,
> 如果你反對大量的 macro, 那大概也不怎麼喜歡 C++ 的 template 吧.
> : 我明白放手不容易,但是頑固的不肯前進讓我懷疑設計者的目光短淺。
macro 和 template 最大的兩個差異是:
1. macro 通常無法用 debugger 做 step into 的動作
2. macro 不提供 type-safe 機制
這是愛用 template 而不用 macro 的人最常主張的兩大特色,
當然我是不清楚 visual studio 的 debugger 能不能解掉 1. 的問題,
但是在 GNU 的 gdb 確定是無解。
--
Name: Tseng, Ling-hua E-mail Address: uranus@it.muds.net
School: National Tsing Hua University Department: Computer Science
Interesting: C++, Compiler, PL/PD, OS, VM, Large-scale software design
Researching: Undecided
Homepage:
https://it.muds.net/~uranus
--
╔═══╗ ┼────────────────────────╮
║狂狷 ║ │
* Origin:[ 狂 狷 年 少 ] whshs.cs.nccu.edu.tw ╰─╮
║ 年少║ ┼╮
< IP:140.119.164.16 > ╰─╮
╚╦═╦╝ ╰
* From:218-171-139-90.dynamic.hinet.net
─╨─╨─ KGBBS ─ ◎ 遨翔"BBS"的狂狷不馴;屬於年少的輕狂色彩 ◎
推 meltice:我的工作還是只用到loop ifelse function203.204.133.140 07/29 13:40
→ meltice:不知道懂這些高深的東西對工作上有無幫助203.204.133.140 07/29 13:40
推 march20:如果你要寫一個 apache 時可能就有用了:P 71.137.21.30 07/29 14:46
推 meltice:問題是我沒有要寫apache啊203.204.133.140 07/29 17:16
→ meltice:我相信只用loop ifelse沒有寫不出的程式203.204.133.140 07/29 17:16
推 march20:我也相信有寫得出來但維護不了的程式 :P 71.137.21.30 07/29 17:28