[問題] 自定義輸出出了問題+float最小值

看板C_and_CPP作者 (無良記者)時間11年前 (2013/06/05 21:56), 編輯推噓3(3016)
留言19則, 8人參與, 最新討論串1/1
開發平台(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 --

11/04 22:52,
一樓帥哥
11/04 22:52

11/04 22:52,
二樓帥哥
11/04 22:52

11/04 22:52,
二樓帥哥
11/04 22:52

11/04 22:52,
..
11/04 22:52

11/04 22:53,
五樓吃屎
11/04 22:53

11/04 22:53,
幹 可以不要當簽名檔嗎...
11/04 22:53
-- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 220.133.35.4

06/05 22:51, , 1F
這種輸出顯然有個 vectorX<T> 被輸出了
06/05 22:51, 1F

06/05 22:51, , 2F
那這就代表 v.sum() 得到了一個 vectorX<T>
06/05 22:51, 2F

06/05 22:53, , 3F
(我說的是 main.cpp 17 行的那個)
06/05 22:53, 3F

06/05 22:53, , 4F
可是你不覺得一個 vectorX<T> 的 sum 還回傳一個 vectorX<T>
06/05 22:53, 4F

06/05 22:53, , 5F
哪裡怪怪的嗎...
06/05 22:53, 5F
但我的回傳值是Type reg 阿ˊˋ

06/05 22:56, , 6F
那個...你再看看 Type reg; 這一行的附近 (汗)
06/05 22:56, 6F

06/05 22:57, , 7F
看不出問題,囧
06/05 22:57, 7F
好像知道了,我把vectorX<Type> sum() 改成了Type sum()

06/05 23:00, , 8F
我覺得我寫暗示的功力有點退步了...vectorX.h 的 60 行
06/05 23:00, 8F

06/05 23:01, , 9F
啊, 你悟了 XD
06/05 23:01, 9F
: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......為什麼-.-

06/05 23:10, , 10F
推LPH~ (到處都要推(?)
06/05 23:10, 10F
原來是多寫了一次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 請問這樣有差嗎._. 因為之後加起來的結果是錯的......

06/05 23:36, , 11F
STL container 用來繼承?
06/05 23:36, 11F
如果我沒搞錯你的意思的話,這的確是助教要我們實作的作法

06/05 23:48, , 12F
STL container都沒做virutal dtor,所以繼承有點危險
06/05 23:48, 12F
不好意思,可以請你解釋的清楚一點嗎0.0?看不太懂

06/06 06:25, , 13F
推LPH 神人 ~~~
06/06 06:25, 13F

06/06 10:18, , 14F
就是STL container沒辦法做到動態連結
06/06 10:18, 14F

06/06 10:18, , 15F
可能無法正確的解構
06/06 10:18, 15F
那請問有辦法修改嗎0.0?

06/06 10:37, , 16F
如果你100%保證Derived不會被轉型成Base那就可以避免..
06/06 10:37, 16F
這邊我很不熟,囧a

06/06 10:40, , 17F
看看書上的"動態多型"章節, 應該就懂了
06/06 10:40, 17F

06/06 10:41, , 18F
既然是作業那就照做吧, 但要記得公開繼承STL容器是危險的
06/06 10:41, 18F
今天去問了助教後,把最後一個問題解決了: float和double的numeric_limits<Type>::min(),印出來的並不是max的負值 而是一個接近0的數,原因和它的二進位表示法有關(有請高手詳細解釋) 因此要得到float和double負數的最小值,得用-numeric_limits<Type>::max()才行 ※ 編輯: o07608 來自: 220.133.35.4 (06/06 19:14)

06/06 21:33, , 19F
不會造成underflow的最小正值。(對,underflow)
06/06 21:33, 19F
文章代碼(AID): #1HhqE5_Q (C_and_CPP)