[問題] oprator <

看板C_and_CPP作者 (倚絃)時間15年前 (2010/08/11 09:48), 編輯推噓5(5038)
留言43則, 7人參與, 最新討論串1/1
( *[1m *[m 為色碼,可以按 Ctrl+V 預覽會顯示的顏色 ) ( 未必需要依照此格式,文章條理清楚即可 ) 遇到的問題: (題意請描述清楚) 物件中 對operator < overloding 給STL的sort() 去跑 程式跑出來的錯誤結果: 開發平台: (例: VC++ or gcc/g++ or Dev-C++, Windows or Linux) GCC 4.5.0 with CodeBlocks 有問題的code: (請善用置底文標色功能) struct FUN { int up, down; double val; FUN() { up = down = val = 0; } FUN(const int& u, const int& d) { up = u, down = d, val = (double)u / (double)d; } bool operator<(const FUN& right) { return val < right.val; } }; // 這樣子不會過 compiler跳到stl_algo.h裡面 就無言了 = =a -------------------------------------------------------- bool operator<(const FUN& left,const FUN& right) { return left.val<right.val; } // 宣告在struct之外 就OK了... 不解 需要補充錯誤訊息 我再補~ 先感謝回答... -- ╮ ╮   ╭┬ ╭─┐┬╮ ◢█▍◢██◣ ─┼─┬┼─ ╰┼──┼╮ │ ╯╮│││ █▉ █▉██ ╮│ ││ ╭─┼─╮ │ └┴┘└┼ ██// █▉ ◥███ ├┼╮├┼╮ │ │ │ │ ├─┼─╮ █ █// █▉ ◥██◤ ││ │││ ┴─┼─┴ │ ╭╯├─╮ ╯│─╯│╰ ○╰─╯╰─╯ ○ ┴ ╯ ┴ ╰ -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 112.104.84.162

08/11 10:34, , 1F
bool operator<(const FUN& right) const <--- 少這個
08/11 10:34, 1F

08/11 10:34, , 2F
因為你沒主程式我也懶得自己測試,但是根據經驗 99.9999%
08/11 10:34, 2F

08/11 10:34, , 3F
是少那個 const。
08/11 10:34, 3F

08/11 13:09, , 4F
樓上是對的 可以請問加在那的意義是...?
08/11 13:09, 4F

08/11 13:19, , 5F
印象中method加const修飾子是method內不得變更object的
08/11 13:19, 5F

08/11 13:20, , 6F
data member內容; 就不確定compare operator是否規定一
08/11 13:20, 6F

08/11 13:20, , 7F
定要掛上const, 想一想其實也很合理就是了:)
08/11 13:20, 7F

08/11 13:44, , 8F
感謝V大說明... 剛正在翻PRIMER... cmp的確不該動到
08/11 13:44, 8F

08/11 13:47, , 9F
也該貼個error的訊息...應該是this型態的問題
08/11 13:47, 9F

08/11 13:49, , 10F
演算法實作細節如果把物件以 const T & 當參數傳遞到其它
08/11 13:49, 10F

08/11 13:50, , 11F
函式,那個函式試圖比較兩個 const T &,
08/11 13:50, 11F

08/11 13:51, , 12F
如果 T::operator< 只有 non-const 版本,那一定出問題。
08/11 13:51, 12F

08/11 13:53, , 13F
實作細節不想動它,自然會以 const 的形式接它和傳遞它。
08/11 13:53, 13F

08/11 13:55, , 14F
物件以 const 形式被使用時,只有 const member function
08/11 13:55, 14F

08/11 13:56, , 15F
可被呼叫。以 non-const 形式存在時則兩種都能呼叫。
08/11 13:56, 15F

08/11 13:57, , 16F
所以如果不是經過事先規劃而是靠直覺新增 member function
08/11 13:57, 16F

08/11 13:58, , 17F
的時候,最好先假設全部都是 const,再確定要拿掉它的理由
08/11 13:58, 17F

08/11 13:59, , 18F
。用這種方法去寫 code,就不會一直發生事後以 const 形式
08/11 13:59, 18F

08/11 13:59, , 19F
傳遞並使用,才一個一個發現原來要補 const 這種情形。
08/11 13:59, 19F

08/11 14:00, , 20F
反過來你忘記拿掉 const 卻又在實作時改變 data member,
08/11 14:00, 20F

08/11 14:00, , 21F
這第一時間 compiler 就會報錯。
08/11 14:00, 21F

08/11 14:01, , 22F
T大知識之淵博真是令小弟十分敬服啊...<(_ _)>
08/11 14:01, 22F

08/11 14:03, , 23F
Push!
08/11 14:03, 23F

08/11 14:05, , 24F
感謝t大超詳細解說... 使用別人的method的確要小心阿~ ~!
08/11 14:05, 24F

08/11 14:08, , 25F
其實是設計 class 給別人用的時候要小心。
08/11 14:08, 25F

08/11 14:08, , 26F
因為明明看起來是用 const T & 接進來以後可以呼叫的函式
08/11 14:08, 26F

08/11 14:09, , 27F
,結果卻不能呼叫。你會覺得非常的火,特別是這種狀況一再
08/11 14:09, 27F

08/11 14:10, , 28F
發生的時候。像是今天你丟這個 class 給你同事用,他寫了
08/11 14:10, 28F

08/11 14:10, , 29F
sort() 才發現 operator< 有問題。結果你只幫 operator<
08/11 14:10, 29F

08/11 14:11, , 30F
補了 const。下次他 call 了其它東西又發現有東西不能用,
08/11 14:11, 30F

08/11 14:11, , 31F
重複幾次下來你大概整個人會黏在牆壁上。
08/11 14:11, 31F

08/11 14:14, , 32F
大概整個人會黏在牆壁上 XD
08/11 14:14, 32F

08/11 14:15, , 33F
了解 <(_ _)> 的確很欠缺和人合作coding的經驗
08/11 14:15, 33F

08/11 14:17, , 34F
原來要取決於sort的實做細節而定
08/11 14:17, 34F

08/11 14:18, , 35F
難怪VC9下member和non-member都可以過...
08/11 14:18, 35F

08/11 15:25, , 36F
其實這就跟設計類別一樣, 一開始先把成員函式設為私有
08/11 15:25, 36F

08/11 15:26, , 37F
再依照你要提供的功能逐一開放, 當然這都要謹慎的分析
08/11 15:26, 37F

08/11 15:27, , 38F
開放之後可能帶來的負作用, 而成員函式如果沒有更改資
08/11 15:27, 38F

08/11 15:28, , 39F
料的行為, 當然也應該採取較閉鎖的作法
08/11 15:28, 39F

08/11 15:29, , 40F
另外如果你把成員函式的參數還原
08/11 15:29, 40F

08/11 15:31, , 41F
bool operator<(FUN *, const FUN& right);
08/11 15:31, 41F

08/11 15:31, , 42F
也可以看出跟 non-member function 的差異, 這函式第
08/11 15:31, 42F

08/11 15:32, , 43F
一個引數當然只能給 pointer to non-const object
08/11 15:32, 43F
文章代碼(AID): #1COW5ZBB (C_and_CPP)