精華區beta java 關於我們 聯絡資訊
※ 引述《iamstudent.bbs@wretch.twbbs.org (有空來下棋喔!됩》之銘言: > ※ 引述《Wiseman.bbs@bbs.cs.nthu.edu.tw (benqer)》之銘言: > > c/c++ 並沒有 int[] x; 的語法 > > 喔, 就因為java有多種宣告陣列的語法嗎? > > 你真是太小看c++了 , 以語言描述多樣性來說, > > c++有運算子多載,泛型編程, 多重繼承, java一個都沒有. > > 平心而論, c++比起java來說是複雜了點, > > 但c++有豐富的語言設施, 可以直接以程式表達設計理念, > > 比起java過於簡化的編程模型, 可以說"進步"太多了 > 這樣講可能會引起筆戰喔 > 這些功能被移除其實是有原因的 不管移除的原因是什麼, 這移除顯示了java並非一個如上面網友所說的,具有語言描述的豐富性 > 運算子多載 > 多重繼承 > 我覺得其實用處不大 java因為沒有運算子多載, 簡單的 a + b*c都得寫成 a.add(b.multiply(c)) 你覺得用處不大, 那麼做數值運算的人呢? 沒有泛型編程 , 所以java的容器在取出元素時得動用轉型, 遇到得以型別 訂製class時, 只能對每個型別製作一個語法幾乎一樣的class. 沒有多重繼承(c#也一樣), 所以如果你的class要繼承兩個class的"介面與實作" 就得用interface來代替另一個class, composite此class之物件, 再動用delegate 實作出此interface的所有methods, 跟vb沒有繼承時候的情形一模一樣 也許以上所說, 很多人都還是覺得用處不大, 所以移除無傷大雅. 但是別忘了sun發展java的目標除了簡單,productive之外, 更重要的是 cross platform, 統一運算平台. 結果java為了簡化的理由把以上功能全都拿掉 嗯 真不知道這樣的做法要如何說服"所有人"採用java. 而java自身的缺點也讓其他競爭對手見縫插針. .NET platform已經針對java的缺點做出改進, .NET把operator overloading納入 但不強迫所有語言都使用, for example, c#支援operator overloading, 但VB並不支援 .NET framework 2.0也將加入template機制, 當然同樣的, 以簡單做號召的VB不 一定會支援. 多重繼承雖然.NET不直接支援, 但語言仍可自行實作出多重繼承, 例如 managed c++依然可以使用多重繼承. so , 結論就是.net平台依然享有java的簡單編程模型(use vb),同時也有結合 java+vb的簡單與c++的語言設施之c#, 如果programmer還是不滿意, 他們還可以 退回到最powerful的c++, 同時依然享有.net的優勢 而java呢, programer得到的只有一個簡化過的編程模型. -- ※ Origin: 楓橋驛站<bbs.cs.nthu.edu.tw> ◆ From: NK219-91-117-21.adsl.dynamic.apol.com.tw > -------------------------------------------------------------------------- < 發信人: Corroson@kkcity.com.tw (藍月楓鈴), 看板: java 標 題: Re: 請問陣列的宣告… 發信站: KKCITY (Sun Jun 20 05:38:00 2004) 轉信站: ptt!ctu-reader!ctu-peer!Spring!news.nctu!news.ntu!bbs.ee.ntu!news.kkci ※ 引述《Wiseman.bbs@bbs.cs.nthu.edu.tw (benqer)》之銘言: > script 是著重在runtime的動態, 彈性很大, 但相對來說型別的使用一有錯誤, > 會在runtime出現無法預期的錯誤, 這種錯誤很難debug. 這就是為何type-safety重要 > 的原因. > 泛型則是著重在compile-time的動態, 型別在compiler-time具現時一旦有錯, > 也只是compile-time error, 夠格的compiler都能夠直接指出錯在哪裡. 不需要 > 等到runtime再來debug. 很贊同 Wiseman 所言。 但我現在想說的,是一個發展方向,而不是現狀。 嚴格的型別定義,與編程彈性,一直使編譯器有很大的困擾,但並非不可解決。 我舉兩個簡單的例子,第一個例子是導引,第二個例子是深入。 導引範例: int fa(int x) { if (x % 1) { cout << "Yes!"; return 1; } else { cout << "No!"; return 0; } } 我一直希望 C/C++ 能夠把他化簡成 function fa (x) { if (x % 1) { cout << "Yes!"; return 1; } else { cout << "No!"; return 0; } } 提問一: 或許有人說,那怎麼知道要 return 什麼呢? 這就是編譯器的工作了,編譯器負責檢查「回傳型態的一致性」。 如果回傳型態具有一致性,那就應該要知道回傳什麼了吧。 提問二: 那怎麼給定 x 的型態? 這也是編譯器的工作。目前不是發展了 template 技術嗎? 把他想成隱式 template 不就達成了。 不過編譯器會很累,必須要檢查該型別是否滿足所有算子(甚至成員)。 不過要滿足上述兩項功能,自動型別轉換有必要作檢討。 深入範例:(很重要的編程風格範例) 嘗試思考下面這個例子: function dynamic (x) { if (x % 1) return Bicycle(x); else return Car(x); } 這可好了,編譯器該如何做?我嘗試著將上面的函式翻譯成 C++ 解法一:使用基礎類別再加以繼承之。 class CC { …略… } ; class Bicycle : CC { …略… }; class Car : CC { …略… }; template<class T> CC * dynamic(T x) { if (x%1) return new Bicycle(x); else return new Car(x); } 解法二:利用 union 此法建議在兩者所使用的空間差異不大時使用, 此解法還必須使這三個先備類別支援 (type &) 建構子才行 struct UBC { char * style_name; union cont { Bicycle b; Car c; }; } template<class T> UBC dynamic(T x) { if (x % 1) return (UBC) {"bicycle", Bicycle(x)}; // C99 新增語法 else return (UBC) {"car", Car(x)}; } 天啊!一個簡潔的編程樣式,翻譯成 C++ 居然要如此的麻煩! 用了 script 之後的小小感想。這並不是理論上的困難,而是技術量太大。 -- ┌─────程式設計樂園─────┐  ̄ ▌ ̄ ╲╱ BBS 城邦 CSZone.kkcity.com.tw ╴ ▌ ▌ ▏ KK免費撥接 └──From:61.231.190.51 ──┘ 電話:449-1999 帳號:kkcity 密碼:kkcity > -------------------------------------------------------------------------- < 發信人: mark00lui.bbs@whshs.cs.nccu.edu.tw (RE->NFA->DFA), 看板: java 標 題: Re: 請問陣列的宣告… 發信站: 政大狂狷年少 (Sun Jun 20 12:03:32 2004) 轉信站: ptt!ctu-reader!ctu-peer!news.nctu!news.csie.ncyu!news.cs.nthu!WHSHS 1.這個討論串似乎偏離原題 2.在討論C++跟java的比較似乎意義有所偏離 2.1 把C++的多重繼承變成java來寫並不是單純的extends + interface java之所以這樣做是想解決一般C++programmer為了方便而亂用繼承的問題 一般來說, 你想會用繼承的時候, 其實80~90%是包含關係, 並不是繼承 因此java強迫只能使用單一繼承, 希望programmer想出比較合邏輯的程式 2.2 operator其實在java中一直存在(如字串可以作加法), 只是被拿掉而矣 又是同一個理由, 解決C++programmer亂用的情況 2.3 template在VM中實行需要code sharing的機制, 在VM語言中有dynamic code loading, 在code的記憶體管理上確實java, C# 會比 C++來得好一點 (請參考OS課本) 總結:C++由於功能太過強大, 真正會寫得好的實在是太難太少了, 這方面只能祈求programmer具有高度編程素養 java正是想解決這方面的問題希望限制設計的思路, 至少把往地獄方向的路關了 ,但並不代表程式會寫得好和寫得出來 (p.s. 1.5出來以後suger語法又再增加了) -- ═══╮═══╮═══╮═╗ ═ ║║║ ╚╯ ║║║ ╚═╝╝╝╚═╝╚╝╚═╝╚╝╚═╝╚╝ -- ╔═══╗ ┼────────────────────────╮ 狂狷 Origin:[ 狂 狷 年 少 ] whshs.cs.nccu.edu.tw ╰─╮ 年少 ┼╮ < IP:140.119.164.16 > ╰─╮ ╚╦═╦╝ From:mulan.cs.nccu.edu.tw ─╨─╨─ KGBBS 遨翔"BBS"的狂狷不馴;屬於年少的輕狂色彩 > -------------------------------------------------------------------------- < 發信人: Wiseman.bbs@bbs.cs.nthu.edu.tw (benqer), 看板: java 標 題: Re: 請問陣列的宣告… 發信站: 清華資訊(楓橋驛站) (Mon Jun 21 03:40:39 2004) 轉信站: ptt!ctu-reader!ctu-peer!news.nctu!news.csie.ncyu!news.cs.nthu!maple > 我一直希望 C/C++ 能夠把他化簡成 > function fa (x) > { > if (x % 1) > { > cout << "Yes!"; > return 1; > } else { > cout << "No!"; > return 0; > } > } 用template+轉型設施已經可以達成你要的效果, 而且還有type-safe的優 點 如下: template<typename P> int fa(P& x) { if (x % 1) {...return 1;} else{return 0;} } int i= fa(1); class1 c1= fa(1); //class1中必須定義建構式 class1(int i), // operator=(int i); class2 c2= fa(class3()); //class2 中必須定義建構式 class2(int i) , // operator=(int i); // class3必須定義 operator % 這樣的作法跟script的差別就在於script用一個共通的type來函括所有type (如vb的variant, js的var) 所以當函式回一個共通的type時,他可能是 int, 可能是char, 可能是一個object, 這時程式要怎麼處理就完全依靠 程式"內隱"的規則. 例如, function func(x) { if (x==1) return CreateObject("xxx.xxx"); else return 1;} 請問, 呼叫func的客戶端要怎麼能知道他拿到的是int還是 object? 答案是客戶端得去了解func的實作內容. 這樣的情形嚴重的傷害到程式 的封裝與抽像特性. 所以script並不適合開發大型程式. 而使用c++, 你可以使用template讓function享有類似script的彈性 又不損及type-safety及runtime performace. 댊 high-level, type-safety, efficiency是c++的特性, 要讓c++改用 script的方式就好像叫c++自廢武功一樣 至於你下面所提的例子, 事實上script的變數並非沒有型別, 而是他們都是繼承至同一個共通的型別,好比是java跟.net的共同基底類別 vb的variant也是類似的觀念. 而script把這類別的宣告藏了起來,好讓程式 簡化. 所以以下面的c++程式來看, c++也只是把這之間的關係描述出來. 你可說c++很繁瑣, 但是至少, 在程式中描述出來的繼承關係, 可以讓 compiler提早揪出錯誤的型別使用. 減少在runtime出錯的可能. 更可加強 程式的可讀性,結構性,邏輯性. 你可以想像一下, 如果dynamic傳回 的一定是bicycle or car之類的交通工具, 為何不在程式明確的指出 dynamic只會回傳交通工具這件事 ,卻要讓使用者冒著可能不小心把回傳 的交通工具當成建築物來使用的風險, 其道理何在? 另外, union的作法絕對是最差的,完全不用考慮. > 深入範例:(很重要的編程風格範例) > 嘗試思考下面這個例子: > function dynamic (x) > { > if (x % 1) > return Bicycle(x); > else > return Car(x); > } > 這可好了,編譯器該如何做?我嘗試著將上面的函式翻譯成 C++ > 解法一:使用基礎類別再加以繼承之。 > class CC { …略… } ; > class Bicycle : CC { …略… }; > class Car : CC { …略… }; > template<class T> > CC * dynamic(T x) > { > if (x%1) > return new Bicycle(x); > else > return new Car(x); > } -- ※ Origin: 楓橋驛站<bbs.cs.nthu.edu.tw> ◆ From: NK219-91-119-85.adsl.dynamic.apol.com.tw > -------------------------------------------------------------------------- < 發信人: Corroson@kkcity.com.tw (藍月楓鈴), 看板: java 標 題: Re: 請問陣列的宣告… 發信站: KKCITY (Mon Jun 21 12:41:30 2004) 轉信站: ptt!ctu-reader!ctu-peer!news.csie.ncyu!news.ncyu!news.ccu!Yuntech-News ※ 引述《Wiseman.bbs@bbs.cs.nthu.edu.tw (benqer)》之銘言: > > 我一直希望 C/C++ 能夠把他化簡成 > > function fa (x) > > { > > if (x % 1) > > { > > cout << "Yes!"; > > return 1; > > } else { > > cout << "No!"; > > return 0; > > } > > } > 用template+轉型設施已經可以達成你要的效果, 而且還有type-safe的優 > 點 > 如下: > template<typename P> > int fa(P& x) > { > if (x % 1) {...return 1;} else{return 0;} > } > int i= fa(1); > class1 c1= fa(1); //class1中必須定義建構式 class1(int i), > // operator=(int i); > class2 c2= fa(class3()); //class2 中必須定義建構式 class2(int i) , > // operator=(int i); > // class3必須定義 operator % fa 只是一個函數。 > 這樣的作法跟script的差別就在於script用一個共通的type來函括所有type NO, function(x) 並不是用一個共通的 type ,而是使用「隱式 template」! 我的 script 是可以編譯為執行檔的。 > (如vb的variant, js的var) 所以當函式回一個共通的type時,他可能是 > int, 可能是char, 可能是一個object, 這時程式要怎麼處理就完全依靠 > 程式"內隱"的規則. 例如, > function func(x) > { if (x==1) return CreateObject("xxx.xxx"); > else return 1;} > 請問, 呼叫func的客戶端要怎麼能知道他拿到的是int還是 object? > 答案是客戶端得去了解func的實作內容. 這樣的情形嚴重的傷害到程式 NO, 編譯時期無法確定其型別,但是執行時期可確定。 因為我們不必在編譯時期就確定他的型別!例如 cout << fb(x); !!!!!!!!!!!!!!!! > 的封裝與抽像特性. 所以script並不適合開發大型程式. > 而使用c++, 你可以使用template讓function享有類似script的彈性 > 又不損及type-safety及runtime performace. 댊 script 可以不損及型別安全和效能。這就是我對 C++ 不甚滿意的地方。 > high-level, type-safety, efficiency是c++的特性, 要讓c++改用 > script的方式就好像叫c++自廢武功一樣 > 至於你下面所提的例子, 事實上script的變數並非沒有型別, > 而是他們都是繼承至同一個共通的型別,好比是java跟.net的共同基底類別 如上所述,並非使用共通型別,而是使用「隱式 template」, 再由編譯器檢查是否符合所有算子以及成員。 時下的 template 不也如此? > vb的variant也是類似的觀念. 而script把這類別的宣告藏了起來,好讓程式 > 簡化. 所以以下面的c++程式來看, c++也只是把這之間的關係描述出來. > 你可說c++很繁瑣, 但是至少, 在程式中描述出來的繼承關係, 可以讓 > compiler提早揪出錯誤的型別使用. 減少在runtime出錯的可能. 更可加強 > 程式的可讀性,結構性,邏輯性. 你可以想像一下, 如果dynamic傳回 > 的一定是bicycle or car之類的交通工具, 為何不在程式明確的指出 > dynamic只會回傳交通工具這件事 ,卻要讓使用者冒著可能不小心把回傳 > 的交通工具當成建築物來使用的風險, 其道理何在? 已經說過原因了,我們並不需要在編譯時期就確定他的型別! 時下 C++ 的 virtual 不也如此?我只能說 C++ 太嫩。 > 另外, union的作法絕對是最差的,完全不用考慮. > > 深入範例:(很重要的編程風格範例) > > 嘗試思考下面這個例子: > > function dynamic (x) > > { > > if (x % 1) > > return Bicycle(x); > > else > > return Car(x); > > } > > 這可好了,編譯器該如何做?我嘗試著將上面的函式翻譯成 C++ > > 解法一:使用基礎類別再加以繼承之。 > > class CC { …略… } ; > > class Bicycle : CC { …略… }; > > class Car : CC { …略… }; > > template<class T> > > CC * dynamic(T x) > > { > > if (x%1) > > return new Bicycle(x); > > else > > return new Car(x); > > } -- ┌─────程式設計樂園─────┐  ̄ ▌ ̄ ╲╱ BBS 城邦 CSZone.kkcity.com.tw ╴ ▌ ▌ ▏ KK免費撥接 └──From:61.231.188.131 ──┘ 電話:449-1999 帳號:kkcity 密碼:kkcity > -------------------------------------------------------------------------- < 發信人: Wiseman.bbs@bbs.cs.nthu.edu.tw (benqer), 看板: java 標 題: Re: 請問陣列的宣告… 發信站: 清華資訊(楓橋驛站) (Tue Jun 22 12:52:51 2004) 轉信站: ptt!ctu-reader!ctu-peer!news.nctu!news.csie.ncyu!news.cs.nthu!maple ※ 引述《Corroson@kkcity.com.tw (藍月楓鈴)》之銘言: > > // class3必須定義 operator % > fa 只是一個函數。 > > 這樣的作法跟script的差別就在於script用一個共通的type來函括所有type > NO, function(x) 並不是用一個共通的 type ,而是使用「隱式 template」! > 我的 script 是可以編譯為執行檔的。 隱式template? 沒聽過這種東西, 也不知道用處在哪 > > (如vb的variant, js的var) 所以當函式回一個共通的type時,他可能是 > > int, 可能是char, 可能是一個object, 這時程式要怎麼處理就完全依靠 > > 程式"內隱"的規則. 例如, > > function func(x) > > { if (x==1) return CreateObject("xxx.xxx"); > > else return 1;} > > 請問, 呼叫func的客戶端要怎麼能知道他拿到的是int還是 object? > > 答案是客戶端得去了解func的實作內容. 這樣的情形嚴重的傷害到程式 > NO, 編譯時期無法確定其型別,但是執行時期可確定。 > 因為我們不必在編譯時期就確定他的型別!例如 cout << fb(x); 使用template就意謂者型別必須於編譯期決定, (多型型別除外), ex cout 是ostream type的物件, 但他的實作並不是去處理執行期才確定的物件 而是針對每種物件定義出不同版本的function, 再由compiler辨析該採用的版本 > script 可以不損及型別安全和效能。這就是我對 C++ 不甚滿意的地方。 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 你真是說了天大的笑話了, 型別安全和效能恰巧就是scrip的缺點, 你如果要說服大家的話,就拿出理由來證明吧 > > high-level, type-safety, efficiency是c++的特性, 要讓c++改用 > > script的方式就好像叫c++自廢武功一樣 > > 至於你下面所提的例子, 事實上script的變數並非沒有型別, > > 而是他們都是繼承至同一個共通的型別,好比是java跟.net的共同基底類別 > 如上所述,並非使用共通型別,而是使用「隱式 template」, > 再由編譯器檢查是否符合所有算子以及成員。 時下的 template 不也如此? 既然說是template, 又說是由compiler檢查type-safety, 那又何來以上所說runtime才確定型別的說法? 你的觀念很矛盾 > > dynamic只會回傳交通工具這件事 ,卻要讓使用者冒著可能不小心把回傳 > > 的交通工具當成建築物來使用的風險, 其道理何在? > 已經說過原因了,我們並不需要在編譯時期就確定他的型別! > 時下 C++ 的 virtual 不也如此?我只能說 C++ 太嫩。 c++太嫩? 我看是你太嫩, 你根本不了解c++的多型跟泛型的意義 就在此妄下斷言 virtual/多型 允許物件的確切型別可以在runtime決定, 但是在compile-time, 多型物件仍會遵循其base class的規則,由compiler進行檢查, 正因為多型物件 在runtime是以base class物件的方式來使用, 所以即使compiler不知道多型物件 的確切型別,也沒有違反type-safety的危險. (多型物件以concret type object來使用時當然也就遵循各別多型物件的規則) > > 另外, union的作法絕對是最差的,完全不用考慮. -- ※ Origin: 楓橋驛站<bbs.cs.nthu.edu.tw> ◆ From: NK219-91-104-168.adsl.dynamic.apol.com.tw > -------------------------------------------------------------------------- < 發信人: Corroson@kkcity.com.tw (藍月楓鈴), 看板: java 標 題: Re: 請問陣列的宣告… 發信站: KKCITY (Wed Jun 23 14:39:50 2004) 轉信站: ptt!ctu-reader!ctu-peer!news.nctu!netnews.csie.nctu!news.ee.ttu!news.n ※ 引述《Wiseman.bbs@bbs.cs.nthu.edu.tw (benqer)》之銘言: > ※ 引述《Corroson@kkcity.com.tw (藍月楓鈴)》之銘言: > > fa 只是一個函數。 > > NO, function(x) 並不是用一個共通的 type ,而是使用「隱式 template」! > > 我的 script 是可以編譯為執行檔的。 > 隱式template? 沒聽過這種東西, 也不知道用處在哪 就是把本來該寫出 template 的地方省略不寫。 > > NO, 編譯時期無法確定其型別,但是執行時期可確定。 > > 因為我們不必在編譯時期就確定他的型別!例如 cout << fb(x); > 使用template就意謂者型別必須於編譯期決定, (多型型別除外), ex > cout 是ostream type的物件, 但他的實作並不是去處理執行期才確定的物件 > 而是針對每種物件定義出不同版本的function, 再由compiler辨析該採用的版本 正是如此。 fb(x) 不必在編譯時期確定其型別! > > script 可以不損及型別安全和效能。這就是我對 C++ 不甚滿意的地方。 > ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ > 你真是說了天大的笑話了, 型別安全和效能恰巧就是scrip的缺點, > 你如果要說服大家的話,就拿出理由來證明吧 在本文之初,就已經說明,並非指現狀,而是指出一個發展方向。 它可以是同時滿足型別安全與執行效能的。 > > 如上所述,並非使用共通型別,而是使用「隱式 template」, > > 再由編譯器檢查是否符合所有算子以及成員。 時下的 template 不也如此? > 既然說是template, 又說是由compiler檢查type-safety, > 那又何來以上所說runtime才確定型別的說法? > 你的觀念很矛盾 就如同 C++ 的指標可以 new 初衍生類別一樣。只不過這樣還不夠彈性。 understand? > > 已經說過原因了,我們並不需要在編譯時期就確定他的型別! > > 時下 C++ 的 virtual 不也如此?我只能說 C++ 太嫩。 > c++太嫩? 我看是你太嫩, 你根本不了解c++的多型跟泛型的意義 就在此妄下斷言 > virtual/多型 允許物件的確切型別可以在runtime決定, 但是在compile-time, > 多型物件仍會遵循其base class的規則,由compiler進行檢查, 正因為多型物件 > 在runtime是以base class物件的方式來使用, 所以即使compiler不知道多型物件 > 的確切型別,也沒有違反type-safety的危險. > (多型物件以concret type object來使用時當然也就遵循各別多型物件的規則) C++ 的缺點,就是必須要以人工的方式作類別正規化。 function dynamic(x) { if (x%1) return Circle(x); else return Square(x); } 以這個例子來說,編譯器至少應該自動去找他的基礎類別才是。 -- ┌─────程式設計樂園─────┐  ̄ ▌ ̄ ╲╱ BBS 城邦 CSZone.kkcity.com.tw ╴ ▌ ▌ ▏ KK免費撥接 └──From:220.138.225.5 ──┘ 電話:449-1999 帳號:kkcity 密碼:kkcity > -------------------------------------------------------------------------- < 發信人: Wiseman.bbs@bbs.cs.nthu.edu.tw (benqer), 看板: java 標 題: Re: 請問陣列的宣告… 發信站: 清華資訊(楓橋驛站) (Thu Jun 24 01:52:27 2004) 轉信站: ptt!ctu-reader!ctu-peer!news.nctu!netnews.csie.nctu!news.cs.nthu!maple ※ 引述《Corroson@kkcity.com.tw (藍月楓鈴)》之銘言: > ※ 引述《Wiseman.bbs@bbs.cs.nthu.edu.tw (benqer)》之銘言: > > 隱式template? 沒聽過這種東西, 也不知道用處在哪 > 就是把本來該寫出 template 的地方省略不寫。 那你要如何處理以下的問題 1. template<typename T> void func(T p) { typename T::size_type i= p.size(); } 現在你說可以把template省略, T也可以省略, 那請問省略之後, 要如何才能取得參數p的型別(原本為T)的typedef ? 如同上例, 我們原本可以用typename T::來取得關於T type的其他資訊 現在你把這些重要資訊都省略了, 要如何解決以上的問題? 2. template的template parameter不一定只用在函式的參數上, 也可能是 用在函式的區域變數 ex template<typename T> T max(T p1, T p2) { T result; if (p2>p1) result = p2; else result= p1; return result; } 如同上例, 請問如果template跟T都省略了, 你如何指定result跟 p1,p2同type這個事實? > > 使用template就意謂者型別必須於編譯期決定, (多型型別除外), ex > > cout 是ostream type的物件, 但他的實作並不是去處理執行期才確定的物件 > > 而是針對每種物件定義出不同版本的function, 再由compiler辨析該採用的版本 > 正是如此。 fb(x) 不必在編譯時期確定其型別! "由compiler辨析該採用的版本"這句話說得還不夠清楚嗎? 你要不要再回去K一下c++的書再來討論? > > ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ > > 你真是說了天大的笑話了, 型別安全和效能恰巧就是scrip的缺點, > > 你如果要說服大家的話,就拿出理由來證明吧 > 在本文之初,就已經說明,並非指現狀,而是指出一個發展方向。 > 它可以是同時滿足型別安全與執行效能的。 根本就是屁話, 你有什麼知識跟經驗夠格為大家指出c++的未來發展方向? 連基礎知識都不夠, 只是看了script的動態彈性就一廂情願的自以為是靈 丹妙藥, 如果你這麼喜歡script, 請改用smalltalk, static type的c++ 是不合你胃口的 > > 既然說是template, 又說是由compiler檢查type-safety, > > 那又何來以上所說runtime才確定型別的說法? > > 你的觀念很矛盾 > 就如同 C++ 的指標可以 new 初衍生類別一樣。只不過這樣還不夠彈性。 > understand? 什麼彈性? 你可以用那樣的彈性應用在那裡? 有彈性就一定好喔 ? , 自己再想想吧 > > c++太嫩? 我看是你太嫩, 你根本不了解c++的多型跟泛型的意義 就在此妄下斷言 > > virtual/多型 允許物件的確切型別可以在runtime決定, 但是在compile-time, > > 多型物件仍會遵循其base class的規則,由compiler進行檢查, 正因為多型物件 > > 在runtime是以base class物件的方式來使用, 所以即使compiler不知道多型物件 > > 的確切型別,也沒有違反type-safety的危險. > > (多型物件以concret type object來使用時當然也就遵循各別多型物件的規則) > C++ 的缺點,就是必須要以人工的方式作類別正規化。 > function dynamic(x) > { > if (x%1) > return Circle(x); > else > return Square(x); > } > 以這個例子來說,編譯器至少應該自動去找他的基礎類別才是。 蠢得要命, function signature不指定回傳的type, 要讓compiler自己猜 就為了少打幾個字, 使用此function的人從此得從function的comment or document 猜回傳的型別. 我想你乾脆就把c++改成type-less, 所有的type都由compiler 從程式中粹取導出定義好了. -- ※ Origin: 楓橋驛站<bbs.cs.nthu.edu.tw> ◆ From: NK219-91-116-171.adsl.dynamic.apol.com.tw > -------------------------------------------------------------------------- < 發信人: Wiseman.bbs@bbs.cs.nthu.edu.tw (benqer), 看板: java 標 題: Re: 請問陣列的宣告… 發信站: 清華資訊(楓橋驛站) (Thu Jun 24 02:46:01 2004) 轉信站: ptt!ctu-reader!ctu-peer!news.nctu!netnews.csie.nctu!news.cs.nthu!maple ※ 引述《Wiseman (benqer)》之銘言: > > C++ 的缺點,就是必須要以人工的方式作類別正規化。 > > function dynamic(x) > > { > > if (x%1) > > return Circle(x); > > else > > return Square(x); > > } > > 以這個例子來說,編譯器至少應該自動去找他的基礎類別才是。 > 蠢得要命, function signature不指定回傳的type, 要讓compiler自己猜 > 就為了少打幾個字, 使用此function的人從此得從function的comment or document > 猜回傳的型別. 再補充一個問題, 別忘了c++採個別編譯的方式來build, 如果採取你的方法的話, 那麼使用dynamic function的module不知道dynamic 的回傳type,compiler在compile此module之時就無法以return type來檢查 是否符合type safety. 總之,除非有顯著的利益(而不是只有少打幾個字) 否則你提的方案根本不切實際 > 我想你乾脆就把c++改成type-less, 所有的type都由compiler > 從程式中粹取導出定義好了. -- ※ Origin: 楓橋驛站<bbs.cs.nthu.edu.tw> ◆ From: NK219-91-116-171.adsl.dynamic.apol.com.tw > -------------------------------------------------------------------------- < 發信人: Wiseman.bbs@bbs.cs.nthu.edu.tw (benqer), 看板: java 標 題: Re: 請問陣列的宣告… 發信站: 清華資訊(楓橋驛站) (Fri Jun 25 04:29:16 2004) 轉信站: ptt!ctu-reader!ctu-peer!news.nctu!news.csie.ncyu!news.cs.nthu!maple ※ 引述《wripery@kkcity.com.tw (平淡)》之銘言: > ※ 引述《Wiseman.bbs@bbs.cs.nthu.edu.tw (benqer)》之銘言: > > 那你要如何處理以下的問題 > 這很容易吧: > 需要加的時候才加就行了! > Take it easy. 既然有需要加的時候, 為何又多此一舉把template省略? 就為了少打幾個字? 為了讓程式看起來像script? > > 1. template<typename T> > > void func(T p) > > { > > typename T::size_type i= p.size(); > > } > > 現在你說可以把template省略, T也可以省略, > > 那請問省略之後, 要如何才能取得參數p的型別(原本為T)的typedef ? > > 如同上例, 我們原本可以用typename T::來取得關於T type的其他資訊 > > 現在你把這些重要資訊都省略了, 要如何解決以上的問題? > > 2. template的template parameter不一定只用在函式的參數上, 也可能是 > > 用在函式的區域變數 ex > > template<typename T> > > T max(T p1, T p2) > > { > > T result; > > if (p2>p1) result = p2; > > else result= p1; > > return result; > > } > > 如同上例, 請問如果template跟T都省略了, 你如何指定result跟 > > p1,p2同type這個事實? > > "由compiler辨析該採用的版本"這句話說得還不夠清楚嗎? > > 你要不要再回去K一下c++的書再來討論? > "由compiler辨析該採用的版本"中, > template 字眼的確是有時可省略的。 根本沒回答問題, template省略了, compiler如何知道T是template parameter 而不是type name?, 如果T也省略了, programmer如何指定p1,p2, local variable 的type? 這麼喜歡省略, 那你為何不建議把class也省略, 反正class沒有return type, 沒有return type, }後面有分號的 的 C { };就可以辨析為class了囉? > > 根本就是屁話, 你有什麼知識跟經驗夠格為大家指出c++的未來發展方向? > > 連基礎知識都不夠, 只是看了script的動態彈性就一廂情願的自以為是靈 > > 丹妙藥, 如果你這麼喜歡script, 請改用smalltalk, static type的c++ > > 是不合你胃口的 > 嗯…看起來這已經不是 script 了,而是比 C++ 更進步的語言。 這麼有遠見的話可以去c++標準委員會提案, 看你怎麼說服c++委員會何以用了十年的template可以省略, 以及script特性為何是c++未來發展的方向 > > 什麼彈性? 你可以用那樣的彈性應用在那裡? > > 有彈性就一定好喔 ? , 自己再想想吧 > 在「程式發展的過程」中,有彈性是很重要的! 彈性不是絕對的優點. > > 蠢得要命, function signature不指定回傳的type, 要讓compiler自己猜 > 不是讓 compiler 自己猜,而是從 return 中尋找,這個功能蠻好的啊。 不要活在自己的世界裡. 請仔細想一下,不然也可以問一下專家, 不指定return type的優點跟缺點相比, 到底何者為大 > > 就為了少打幾個字, 使用此function的人從此得從function的comment or document > > 猜回傳的型別. > > 我想你乾脆就把c++改成type-less, 所有的type都由compiler > > 從程式中粹取導出定義好了. > 程式語言的最終目的,本來就是要讓人類輕鬆簡易的表達出所需要的計算功能。 > 一起朝這個方向來努力吧!讓 C++ 達到「容易表達」的境地吧。 把return type 省略就叫做容易表達 嗎? 我覺得是無法表達吧, 沒有return type所以programmer無法表達明確的return type 再提醒一次, 你們的想法真是蠢到爆, 要不要修正就看你們了 -- ※ Origin: 楓橋驛站<bbs.cs.nthu.edu.tw> ◆ From: NK219-91-114-115.adsl.dynamic.apol.com.tw > -------------------------------------------------------------------------- < 發信人: Corroson@kkcity.com.tw (藍月楓鈴), 看板: java 標 題: Re: 請問陣列的宣告… 發信站: KKCITY (Sun Jun 27 07:03:49 2004) 轉信站: ptt!ctu-reader!ctu-peer!news.nctu!netnews.csie.nctu!news.ee.ttu!news.n ※ 引述《wripery@kkcity.com.tw (平淡)》之銘言: > 我們在思考問題的時候,經常不是先思考計算結果的結構,而是思考演算的過程; > 因此這樣的彈性很容易的讓我們以臨時決定的方式,來決定回傳的結構, > 這在「軟體發展過程」中,是一個重要的特性。 (很切實際) 這種回傳值,首先發難的,仍然可能是 C++ 或者 Java 之一, 因為他們各持其中的特點,現在缺乏將兩造融合的機制: C++ 特點: template 技術 JAVA特點: 匿名類別,特別是可回傳內嵌的匿名類別。 不過將此兩者融合,有一個根本性的問題, 那就是必須在此下述問題中做一個抉擇: 是否要將所有物件,衍生自單一根類別。 這會造成核心技術的不同。 我以下面的觀點做結尾: 如果依目前的機器來說,我傾向於 C++ 不衍生自單一根類別的做法。 不過若連晶片設計都考慮進去,那我傾向於 JAVA 衍生自單一根類別的做法。 -- ┌─────程式設計樂園─────┐  線上音樂新震撼   CSZone.kkcity.com.tw ^_^ / 隨選隨播免等待 KKBOX ^_^ / └──From:61.231.174.35 ──┘   http://www.kkbox.com.tw