看板 C_and_CPP 關於我們 聯絡資訊
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) VC++ 2010 問題(Question): 最近在寫OOP的最後一個作業,主要是練習template、exception和繼承 題目要求我們寫一個繼承自std::vector的class vectorX vectorX要能夠存入任何型態的資料,不過每個vectorX裡的資料型態都一樣 然後程式會把vectorX裡的所有資料加起來,並把結果印出來 如果結果比該型態的最大值還大、或是比最小值還小,則會扔出exception並印錯誤訊息 整個程式我都寫好了,目前也都沒有error的存在 但在執行時遇到了問題: 我在加總並印出東西時,如果遇到exception會順利的把錯誤訊息印出來 但如果總和在範圍內,反而會印出很奇怪的結果 因為這奇怪的結果跟我自定義的ostream樣子一樣,我懷疑是否是ostream出了問題 但憑我一己之力無法解決...... 請問板友們能幫我檢查看看哪裡出了問題嗎0.0? 感謝>"< 餵入的資料(Input): vectorX vi2(5, 6) vectorX vi3(numeric_limits<int>::min() + 3, -10, 0, 6, 7, numeric_limits<int>::max() - 3) 預期的正確結果(Expected Output): 第一個結果是30,第二個結果是2 錯誤結果(Wrong Output): 第一個結果: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 第二個結果: 0, 0, 0, 0, 0, 0, 程式碼(Code):(請善用置底文網頁, 記得排版) vectorX.h:http://codepad.org/osPatcjY main.cpp:http://codepad.org/HD4rB1uY 補充說明(Supplement): 我想不到更好的標題了......板主如果有更適合的標題請幫我改,感謝Q_Q --
gcobc12632 :一樓帥哥11/04 22:52
maple0935 :二樓帥哥11/04 22:52
howar31 :二樓帥哥11/04 22:52
howar31 :..11/04 22:52
maple0935 :五樓吃屎 11/04 22:53
maple0935 :幹 可以不要當簽名檔嗎... 11/04 22:53
-- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 220.133.35.4
LPH66:這種輸出顯然有個 vectorX<T> 被輸出了 06/05 22:51
LPH66:那這就代表 v.sum() 得到了一個 vectorX<T> 06/05 22:51
LPH66:(我說的是 main.cpp 17 行的那個) 06/05 22:53
LPH66:可是你不覺得一個 vectorX<T> 的 sum 還回傳一個 vectorX<T> 06/05 22:53
LPH66:哪裡怪怪的嗎... 06/05 22:53
但我的回傳值是Type reg 阿ˊˋ
LPH66:那個...你再看看 Type reg; 這一行的附近 (汗) 06/05 22:56
o07608:看不出問題,囧 06/05 22:57
好像知道了,我把vectorX<Type> sum() 改成了Type sum()
LPH66:我覺得我寫暗示的功力有點退步了...vectorX.h 的 60 行 06/05 23:00
LPH66:啊, 你悟了 XD 06/05 23:01
:D 感謝~ 然後現在開始修正計算方式,QAQ ※ 編輯: o07608 來自: 220.133.35.4 (06/05 23:02) vectorX vi3(numeric_limits<int>::min() + 3, -10, 0, 6, 7, numeric_limits<int>::max() - 3) 現在這個結果會變成6......為什麼-.-
purincess:推LPH~ (到處都要推(?) 06/05 23:10
原來是多寫了一次head++ -_- ※ 編輯: o07608 來自: 220.133.35.4 (06/05 23:23) 現在在做float test,碰到另一個問題: vectrX vf1(1.73f, numeric_limits<float>::max() - 0.5f, 0.0f, -1.0f, -numeric_limits<float>::max() + 0.5f) 在助教給的測資裡,應該是要印出: 1.73, 3.40282e+38, 0, -1, -3.40282e+38 這樣 可是我會印出: 1.73, 3.40282e+038, 0, -1, -3.40282e+038 請問這樣有差嗎._. 因為之後加起來的結果是錯的......
legnaleurc:STL container 用來繼承? 06/05 23:36
如果我沒搞錯你的意思的話,這的確是助教要我們實作的作法
azureblaze:STL container都沒做virutal dtor,所以繼承有點危險 06/05 23:48
不好意思,可以請你解釋的清楚一點嗎0.0?看不太懂
cuteclare:推LPH 神人 ~~~ 06/06 06:25
CaptainH:就是STL container沒辦法做到動態連結 06/06 10:18
CaptainH:可能無法正確的解構 06/06 10:18
那請問有辦法修改嗎0.0?
CaptainH:如果你100%保證Derived不會被轉型成Base那就可以避免.. 06/06 10:37
這邊我很不熟,囧a
CaptainH:看看書上的"動態多型"章節, 應該就懂了 06/06 10:40
CaptainH:既然是作業那就照做吧, 但要記得公開繼承STL容器是危險的 06/06 10:41
今天去問了助教後,把最後一個問題解決了: float和double的numeric_limits<Type>::min(),印出來的並不是max的負值 而是一個接近0的數,原因和它的二進位表示法有關(有請高手詳細解釋) 因此要得到float和double負數的最小值,得用-numeric_limits<Type>::max()才行 ※ 編輯: o07608 來自: 220.133.35.4 (06/06 19:14)
MOONRAKER:不會造成underflow的最小正值。(對,underflow) 06/06 21:33