[問題] Implicit Class-Type Conversions 的問題?

看板C_and_CPP (C/C++)作者 (vbdcnj)時間15年前 (2011/03/09 22:07), 編輯推噓1(1032)
留言33則, 4人參與, 最新討論串1/1
Dev C++ 程式碼(Code): class Sales_item{ public: Sales_item(const string& book="default"):isbn(book){} Sales_item(istream &is); bool same_isbn(const Sales_item& rhs) { return isbn==rhs.isbn; } private: string isbn; }; 以上程式照書上打的 Q1. string temp("num"); Sales_item item; item.same_isbn(temp); //可以,隱式轉型。 item.same_isbn("num"); 的話會怎麼樣呢?????? 我的猜測是會先透過string的constructor隱式轉型為string 再透過Sales_item(const string& book="default"); 隱式轉型為Sales_item. 但是我似乎錯了,出現 no matching function for call to `Sales_item::same_isbn(const char[4])' 為什麼沒被轉成string...........?? Q2. 書上說item.same_isbn(temp); temp被轉型為Sales_item物件,一個暫時物件 。一旦same_isbn()結束就消失。創建一個檢驗結束就丟棄的物件這個行為是錯的。 item.same_isbn(Sales_item(temp);才是好的寫法。 反正都會創建暫時物件,有差嗎??? 還有Sales_item(temp) 這個寫法是....??? Q3. 為什麼Sales_item temp(cin); 這樣宣告會出現: [Linker error] undefined reference to`Sales_item::Sales_item(std::istream&)' 而且constructor不重載,重新打成 Sales_item(istream &is):isbn(is){}還多了一行 invalid conversion from `void*' to `const char*' 這個應該是指cin 回傳的void* 無法被轉為 常數字串吧??? -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.115.204.114

03/09 22:19, , 1F
Q1: 隱式轉換只能做一次 char[4]→const string&→
03/09 22:19, 1F

03/09 22:19, , 2F
Sales_item
03/09 22:19, 2F

03/09 22:22, , 3F
Q2: 呼叫建構子, 明確跟編譯器講要創建一個暫時物件
03/09 22:22, 3F

03/09 22:23, , 4F
Q3: 這個版本的建構子是使用串流物件來輸入你的 isbn
03/09 22:23, 4F

03/09 22:24, , 5F
就像你用 cin >> str; 的寫法類似, 並不是用它直接丟
03/09 22:24, 5F

03/09 22:25, , 6F
給 std::string 的建構子, 因為 istream 型態的物件提
03/09 22:25, 6F

03/09 22:26, , 7F
供operator void*, 編譯器認為最適合丟給string建構子
03/09 22:26, 7F

03/09 22:26, , 8F
的要先透過這個轉換
03/09 22:26, 8F

03/09 22:30, , 9F
所以創建一個檢驗結束就丟棄的物件這個行為哪裡錯??
03/09 22:30, 9F

03/09 22:31, , 10F
他不是本來比較完就沒事了...
03/09 22:31, 10F

03/09 22:45, , 11F
Q3可以給我一個宣告的例子嗎?? 我笨笨的用了
03/09 22:45, 11F

03/09 22:45, , 12F
Sales_item temp(cin>>str);
03/09 22:45, 12F

03/09 22:45, , 13F
謝謝
03/09 22:45, 13F

03/09 22:51, , 14F
C++ Primer這裡是說用string str="123"; 去餵給 same_isbn
03/09 22:51, 14F

03/09 22:52, , 15F
進而做隱式轉換產生的暫時物件,是可以的,因為原始資料
03/09 22:52, 15F

03/09 22:53, , 16F
還是在str裡面。但是用cin餵給same_isbn,你的資料來源是
03/09 22:53, 16F

03/09 22:53, , 17F
螢幕輸入,又最後存在暫時物件裡,那檢查完東西就弄丟了
03/09 22:53, 17F

03/09 23:06, , 18F
感謝樓上。可是還有一個問題...
03/09 23:06, 18F

03/09 23:07, , 19F
就是Sales_item temp(cin); 編不過,我還是不太懂
03/09 23:07, 19F

03/09 23:07, , 20F
明明書上是這樣子寫的
03/09 23:07, 20F

03/09 23:08, , 21F
錯誤訊息是什麼?
03/09 23:08, 21F

03/09 23:09, , 22F
到底istream& 這個參數要放什麼才對呢??
03/09 23:09, 22F

03/09 23:11, , 23F
錯誤訊息就上面Q3 打的 還有
03/09 23:11, 23F

03/09 23:11, , 24F
ld returned 1 exit status
03/09 23:11, 24F

03/09 23:12, , 25F
Sales_item(istream &is) { } 這樣的話?
03/09 23:12, 25F

03/09 23:13, , 26F
XD 怎麼寫我不是打出來了嗎?
03/09 23:13, 26F

03/09 23:15, , 27F
Sales_item(istream &is) { } 可以編過了。
03/09 23:15, 27F

03/09 23:16, , 28F
抱歉 我The IO library那一章都有看沒有懂
03/09 23:16, 28F

03/09 23:18, , 29F
可是書上真的寫Sales_item(istream &is); 這樣
03/09 23:18, 29F

03/09 23:20, , 30F
因為實作可以分離呀~
03/09 23:20, 30F

03/09 23:21, , 31F
!!
03/09 23:21, 31F

03/09 23:24, , 32F
我還以為那是因為要"重載"constructor
03/09 23:24, 32F

03/09 23:33, , 33F
感謝各位...原來忘記定義>>。Q Q
03/09 23:33, 33F
文章代碼(AID): #1DTucktk (C_and_CPP)
文章代碼(AID): #1DTucktk (C_and_CPP)