[問題] operator overloading <<

作者: moebear (萌熊)   2017-05-02 03:04:23
開發平台(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++會失敗。
作者: steve1012 (steve)   2017-05-02 03:09:00
為什麼都不付一下source code
作者: moebear (萌熊)   2017-05-02 03:11:00
我覺得比較屬於概念性的問題
作者: steve1012 (steve)   2017-05-02 03:17:00
看起來是因為你用lvalue ref. 不能抓temporary variablea*b是rvalue吧沒付code 的話可以盡量解釋清楚一點 這樣大家比較好找問題 像是什麼是''obj 一定要const?'' 是指 overload的operator 的參數是const 還是在說你傳進去的物件一定要是const 預期的正確結果那邊寫一個加上const 也不太清楚是什麼東西加上const
作者: moebear (萌熊)   2017-05-02 03:26:00
主要就是程式碼那邊的那行 為什麼要加上const*會return一個我定義的class. BigNum
作者: steve1012 (steve)   2017-05-02 03:39:00
C++不允許你直接抓temporary object 然後改他的值 所以你要用const lvalue reference當然現在有rvalue reference 能做這件事(改值)概念是 a*b是一個temporary object. 你並沒有給他一個名字 所以他馬上就會消失 讓user 改他的值並沒有什麼意義(可能還有別的考量點)
作者: johnhmj (耗呆肥羊)   2017-05-02 07:19:00
你有沒有寫 BigNum& operator*(const BigNum& obj)?
作者: hunandy14 (Charlott.HonG)   2017-05-02 11:50:00
記得是規範 但是規範跟實作是兩回事編譯器守不守他的事大前提很明白 obj 你不會動到 所以加上constostream 你需要動到他不能加 const這裡 a*b 返回值是 const 所以你參數不加會找不到更正 rvalue ^const
作者: steve1012 (steve)   2017-05-02 12:54:00
Bind rvalue 要麼用rval reference 要麼用const lvaluereference
作者: s4300026 (s4300026)   2017-05-02 18:51:00
我猜是重載運算子,右側變數加上const
作者: pttworld (批踢踢世界)   2017-05-02 19:35:00
貼一下你的乘,回傳是什麼
作者: moebear (萌熊)   2017-05-02 20:19:00
回傳是BigNum 我定義的class
作者: hunandy14 (Charlott.HonG)   2017-05-02 20:25:00
應該是要你傳 op*() 前面是什麼 有沒有 * & const還是就什麼都沒有~
作者: moebear (萌熊)   2017-05-02 20:47:00
已補充程式碼看起來應該是因為他是暫存的值 不能用ref去傳入我試著把const跟&一起拿掉就可以了
作者: hunandy14 (Charlott.HonG)   2017-05-02 22:06:00
一起補上是比較好的cst BigNum op*(cst BigNum& A2, cst BigNum& B2)istream& op>>(istream& str, cst BigNum& obj)
作者: steve1012 (steve)   2017-05-02 22:41:00
暫存值可以傳 只是規定要const lval reference 或是傳copy 但傳copy 可能不efficient傳lvalue reference 是一個& rvalue 是兩個&&
作者: Killercat (殺人貓™)   2017-05-03 19:13:00
話說你可以直接解釋一下 你的case為什麼可能非const?
作者: moebear (萌熊)   2017-05-03 20:45:00
什麼意思
作者: Killercat (殺人貓™)   2017-05-04 07:29:00
"請問為什麼在做<<的時候,obj一定要用const?"答案是這是operator spec,然而這spec對你來講有什麼case讓你碰到困難,一定得mutable嗎?可以提出來大家幫你看看 拿一下主義誒,我好像有點誤解你問的問題,我看看我剛幫你看了一下 clang看起來可以cout << a*b
作者: steve1012 (steve)   2017-05-04 14:51:00
所以我一開始才說問問題要問清楚...

Links booklink

Contact Us: admin [ a t ] ucptt.com