[問題] 怎麼用friend方式寫operator=

看板C_and_CPP作者 (帥凱)時間15年前 (2010/06/30 16:59), 編輯推噓4(4030)
留言34則, 10人參與, 最新討論串1/1
( *[1m *[m 為色碼,可以按 Ctrl+V 預覽會顯示的顏色 ) ( 未必需要依照此格式,文章條理清楚即可 ) 遇到的問題: (題意請描述清楚) 最近在自己看書練習C++ 有一題習題是叫我把運算子=的多載移出類別外,設定成friend友誼函數 可我怎麼設定都沒辦法編譯,不清楚是哪裡出問題 所以上來問問各位大大 希望得到的正確結果: 希望成功把operator=()拿出類別外,當成friend友誼函數 程式跑出來的錯誤結果: 'void operator=(CWin&,const CWin&)' must be a non-static member function ambiguous overload for 'operator=' in 'win1=win2' 開發平台: Dev-C++, Windows vista 有問題的code) #include <iostream> #include <cstdlib> using namespace std; class CWin { private: char id,*title; public: CWin(char i='D',char *text="Default window"):id(i) { title=new char[50]; strcpy(title,text); } void set_data(char i,char *text) { id=i; strcpy(title,text); } void show(void) { cout << "Window " << id << ": " << title << endl; } ~CWin() { delete [] title; } CWin(const CWin &win) { id=win.id; strcpy(title,win.title); } friend void operator=(CWin &win1,const CWin &win2) //!!!這裡有問題!!! { win1.id=win2.id; strcpy(win1.title,win2.title); } }; int main(void) { CWin win1('A',"Main Window"); CWin win2; win1.show(); win2.show(); win1=win2; cout << endl << "設定win1=win2之後..." << endl; win1.show(); win2.show(); win1.set_data('B',"Hello Window"); cout << endl << "更改win1的資料成員之後..." << endl; win1.show(); win2.show(); system("pause"); return 0; } 補充說明: 可以的話順便告訴我為什麼要用const呢? 不太懂他的意思 謝謝大家 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 120.33.49.170

06/30 17:02, , 1F
operator= 必須是member 不能是friend
06/30 17:02, 1F

06/30 17:07, , 2F
所以一定只能寫在類別裡面,不能拿出外面寫囉?@@
06/30 17:07, 2F

06/30 18:21, , 3F
win1 不要 const....你要改 win1 啊
06/30 18:21, 3F

06/30 18:22, , 4F
win2 用 const 的理由則是用 const CWin & 讓它不要複製一份
06/30 18:22, 4F

06/30 18:22, , 5F
而且也不讓這裡面去改到 win2
06/30 18:22, 5F

06/30 18:48, , 6F
我已經試著把win1的const拿掉了,可是還是不能通過編譯
06/30 18:48, 6F

06/30 18:48, , 7F
好怪= =
06/30 18:48, 7F

06/30 18:52, , 8F
建議仔細看錯誤訊息 也可以拿去google找找看
06/30 18:52, 8F

06/30 18:53, , 9F
恩,謝謝樓上的建議,我都試過了還是沒法解決才來問的QQ
06/30 18:53, 9F

06/30 18:55, , 10F
那就請修改文章附上最新的程式碼與錯誤訊息吧 :)
06/30 18:55, 10F
※ 編輯: HANDSOMEKAI 來自: 120.33.49.170 (06/30 19:03)

06/30 19:14, , 11F
你要移出class外啊 你這樣還是放在class裡啊
06/30 19:14, 11F

06/30 19:15, , 12F
你放在class裡就是member function,這樣當然會錯啊
06/30 19:15, 12F

06/30 19:21, , 13F
我直接把定義寫在class裡,這不影響吧?
06/30 19:21, 13F

06/30 19:42, , 14F
我覺得一樓是正解。
06/30 19:42, 14F

06/30 19:44, , 15F
= -> [] function call() 應該都不能friend。
06/30 19:44, 15F

06/30 19:45, , 16F
應該說,不能overloaded by friend functions。
06/30 19:45, 16F

06/30 19:46, , 17F
所以說...我被習題耍了嗎= = 囧~
06/30 19:46, 17F

06/30 19:50, , 18F
我的觀念不一定正確,因為書本已經離我很久遠了。
06/30 19:50, 18F

06/30 19:53, , 19F
錯誤訊息蠻明白的
06/30 19:53, 19F

06/30 19:57, , 20F
樓上可以大發慈悲解釋給我聽一下嗎Q口Q
06/30 19:57, 20F

06/30 19:58, , 21F
must be a non-static member function
06/30 19:58, 21F

06/30 19:59, , 22F
必須要是一個非靜態「成員函式」
06/30 19:59, 22F

06/30 20:02, , 23F
所以一定得用成員函數的方式來寫囉? 那為什麼習題要
06/30 20:02, 23F

06/30 20:03, , 24F
我用friend和一般函數的方式寫= = 謝謝解答囉!
06/30 20:03, 24F

06/30 20:04, , 25F
請問你使用的書是...?
06/30 20:04, 25F

06/30 20:07, , 26F
C++教學手冊 第二版 by洪維恩
06/30 20:07, 26F

06/30 20:08, , 27F
爬板上文找到的推薦新手用書,剛開始學而已
06/30 20:08, 27F

06/30 20:57, , 28F
這本書... XD
06/30 20:57, 28F

06/30 21:14, , 29F
這本書怎麼了?樓上笑的很詭異喔= ="
06/30 21:14, 29F

06/30 21:14, , 30F
好像是傳說中的考備建構員?
06/30 21:14, 30F

06/30 21:18, , 31F
是低,拷貝建構元= =
06/30 21:18, 31F

06/30 21:48, , 32F
= 本來就只能是 member function。 -tor 字尾習慣翻「子」
06/30 21:48, 32F

07/01 10:42, , 33F

07/01 11:23, , 34F
千查萬查,竟然忘了查WIKI= =,感謝樓上!!!
07/01 11:23, 34F
文章代碼(AID): #1CAmUElr (C_and_CPP)