精華區beta Programming 關於我們 聯絡資訊
※ 引述《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