[問題] operator overloading <<

看板C_and_CPP作者 (萌熊)時間7年前 (2017/05/02 03:04), 7年前編輯推噓17(17032)
留言49則, 7人參與, 最新討論串1/1
開發平台(Platform): (Ex: Win10, Linux, ...) win 10 / linux 編譯器(Ex: GCC, clang, VC++...)+目標環境(跟開發平台不同的話需列出) G++ / VC++ 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...) 問題(Question): 我在做大數的library(作業) 請問為什麼在做<<的時候,obj一定要用const? 如果不是const的話,會編譯不過。 餵入的資料(Input): //a,b,c是class cout << a*b; // 這樣打會編譯失敗 cout << a; // 但是這樣打可以 c=a*b; cout << c; // 這樣打也可以 預期的正確結果(Expected Output): 加上const 錯誤結果(Wrong Output): 程式碼(Code):(請善用置底文網頁, 記得排版) ostream & operator << (ostream & str, const BigNum & obj) 作業已經demo了 貼上來應該沒關係 http://ideone.com/ifYD2i 補充說明(Supplement): 在visual studio 裡面可以編譯成功,但是g++會失敗。 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 140.113.91.189 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1493665465.A.3CF.html ※ 編輯: moebear (140.113.91.189), 05/02/2017 03:05:01

05/02 03:09, , 1F
為什麼都不付一下source code
05/02 03:09, 1F

05/02 03:11, , 2F
我覺得比較屬於概念性的問題
05/02 03:11, 2F

05/02 03:17, , 3F
看起來是因為你用lvalue ref. 不能抓temporary variabl
05/02 03:17, 3F

05/02 03:17, , 4F
e
05/02 03:17, 4F

05/02 03:17, , 5F
a*b是rvalue吧
05/02 03:17, 5F

05/02 03:24, , 6F
沒付code 的話可以盡量解釋清楚一點 這樣大家比較好找
05/02 03:24, 6F

05/02 03:24, , 7F
問題 像是什麼是''obj 一定要const?'' 是指 overload
05/02 03:24, 7F

05/02 03:24, , 8F
的operator 的參數是const 還是在說你傳進去的物件一
05/02 03:24, 8F

05/02 03:25, , 9F
定要是const 預期的正確結果那邊寫一個加上const 也
05/02 03:25, 9F

05/02 03:25, , 10F
不太清楚是什麼東西加上const
05/02 03:25, 10F

05/02 03:26, , 11F
主要就是程式碼那邊的那行 為什麼要加上const
05/02 03:26, 11F

05/02 03:30, , 12F
*會return一個我定義的class. BigNum
05/02 03:30, 12F

05/02 03:39, , 13F
C++不允許你直接抓temporary object 然後改他的值 所以
05/02 03:39, 13F

05/02 03:39, , 14F
你要用const lvalue reference
05/02 03:39, 14F

05/02 03:40, , 15F
當然現在有rvalue reference 能做這件事(改值)
05/02 03:40, 15F

05/02 03:45, , 16F
概念是 a*b是一個temporary object. 你並沒有給他一個
05/02 03:45, 16F

05/02 03:45, , 17F
名字 所以他馬上就會消失 讓user 改他的值並沒有什麼意
05/02 03:45, 17F

05/02 03:45, , 18F
義(可能還有別的考量點)
05/02 03:45, 18F

05/02 07:19, , 19F
你有沒有寫 BigNum& operator*(const BigNum& obj)?
05/02 07:19, 19F

05/02 11:50, , 20F
記得是規範 但是規範跟實作是兩回事編譯器守不守他的事
05/02 11:50, 20F

05/02 11:51, , 21F
大前提很明白 obj 你不會動到 所以加上const
05/02 11:51, 21F

05/02 11:51, , 22F
ostream 你需要動到他不能加 const
05/02 11:51, 22F

05/02 11:54, , 23F
這裡 a*b 返回值是 const 所以你參數不加會找不到
05/02 11:54, 23F

05/02 11:58, , 24F
更正 rvalue ^const
05/02 11:58, 24F

05/02 12:54, , 25F
Bind rvalue 要麼用rval reference 要麼用const lvalue
05/02 12:54, 25F

05/02 12:54, , 26F
reference
05/02 12:54, 26F

05/02 18:51, , 27F
我猜是重載運算子,右側變數加上const
05/02 18:51, 27F

05/02 19:35, , 28F
貼一下你的乘,回傳是什麼
05/02 19:35, 28F

05/02 20:19, , 29F
回傳是BigNum 我定義的class
05/02 20:19, 29F
※ 編輯: moebear (140.113.91.189), 05/02/2017 20:22:44

05/02 20:25, , 30F
應該是要你傳 op*() 前面是什麼 有沒有 * & const
05/02 20:25, 30F

05/02 20:25, , 31F
還是就什麼都沒有~
05/02 20:25, 31F

05/02 20:47, , 32F
已補充程式碼
05/02 20:47, 32F

05/02 21:07, , 33F
看起來應該是因為他是暫存的值 不能用ref去傳入
05/02 21:07, 33F

05/02 21:08, , 34F
我試著把const跟&一起拿掉就可以了
05/02 21:08, 34F

05/02 22:06, , 35F
一起補上是比較好的
05/02 22:06, 35F

05/02 22:08, , 36F
cst BigNum op*(cst BigNum& A2, cst BigNum& B2)
05/02 22:08, 36F

05/02 22:09, , 37F
istream& op>>(istream& str, cst BigNum& obj)
05/02 22:09, 37F

05/02 22:41, , 38F
暫存值可以傳 只是規定要const lval reference 或是傳c
05/02 22:41, 38F

05/02 22:41, , 39F
opy 但傳copy 可能不efficient
05/02 22:41, 39F

05/02 22:42, , 40F
傳lvalue reference 是一個& rvalue 是兩個&&
05/02 22:42, 40F

05/03 19:13, , 41F
話說你可以直接解釋一下 你的case為什麼可能非const?
05/03 19:13, 41F

05/03 20:45, , 42F
什麼意思
05/03 20:45, 42F

05/04 07:29, , 43F
"請問為什麼在做<<的時候,obj一定要用const?"
05/04 07:29, 43F

05/04 07:30, , 44F
答案是這是operator spec,然而這spec對你來講有什麼
05/04 07:30, 44F

05/04 07:30, , 45F
case讓你碰到困難,一定得mutable嗎?
05/04 07:30, 45F

05/04 08:11, , 46F
可以提出來大家幫你看看 拿一下主義
05/04 08:11, 46F

05/04 08:12, , 47F
誒,我好像有點誤解你問的問題,我看看
05/04 08:12, 47F

05/04 08:23, , 48F
我剛幫你看了一下 clang看起來可以cout << a*b
05/04 08:23, 48F

05/04 14:51, , 49F
所以我一開始才說問問題要問清楚...
05/04 14:51, 49F
文章代碼(AID): #1P1uQvFF (C_and_CPP)