推 shadow0326:我對3-D有疑惑, 可以請問"應該"的理由嗎? 11/16 16:13
ex:
當operator +為member function時
Object obj;
double x;
double y;
x=obj+y;->x=obj.operator+(y)//這是ok
但是x=y+obj;->x=y.operator+(obj);//這是無法辦到的
上一行的結果是不自然的,
你不能要求使用者永遠只能用x=obj+y;去撰寫程式.
實際上作者也知道implict的問題,因此它用多載來解決.
至於shadow0326遲遲無法完全接這理由,
還有一個原因.我沒有拿<<和>>當例子.(><因為我無法理解書中的解釋,只能請其他人舉例)
ps:
拍謝,引用tropical72為例子
→ legnaleurc:因為 members => 看得到 private => 高耦合吧 11/16 16:37
推 tropical72:Object obj;double x,y; x=obj+y; x=obj.operator+(y) 11/16 16:51
→ tropical72:此使 memmber 即可, 考慮 x=y+obj; 11/16 16:51
→ tropical72:( x=y.operator+(obj); 錯誤), 需用 global overload 11/16 16:51
→ tropical72:為考量x=y+obj/x=obj+y 均可正常執行,故建議用 11/16 16:51
→ tropical72:global overload operator. 11/16 16:51
→ Ag2S:想問一下,private data就只好用friend解嗎?這樣會比較好? 11/16 16:54
→ tropical72:試想一下如果 class string 要支援 strlen() 的話怎做? 11/16 17:10
→ tropical72:別把 friend 視作會破壞oo,擅用它會使得oo更好. 11/16 17:11
推 shadow0326:唔, 要滿足交換率的前提應該是能掌握好implict轉換的結 11/16 17:19
→ shadow0326:果吧, 反過來說, 如果implict轉換會造成非預期的結果, 11/16 17:20
→ shadow0326:non-member似乎反而會造成麻煩? 11/16 17:20
→ angleevil:其實tropical72的解釋比我好,你問這個問題時,我還真不知 11/16 17:20
→ angleevil:到如何回答.基本上non-member也可以用多載來解決 11/16 17:22
→ angleevil:ex:operator+(const complex& lhs,const double & rhs) 11/16 17:22
→ angleevil:operator+(const double& lhs,const const & rhs) 11/16 17:23
推 shadow0326:當然也可以寫兩個多載來避免implict, 不過我是覺得不一 11/16 17:23
→ shadow0326:有必要為了滿足交換率而做到這種地步... 11/16 17:23
→ shadow0326:更正: 不一定 11/16 17:24
→ angleevil:但是當你把相加的結果assign時,就必須是non-member 11/16 17:26
→ shadow0326:結果的assign是由operator的回傳型態決定的吧? 11/16 17:27
→ angleevil:不對喔,你要先看看2A.它實際上是怎樣呼叫的 11/16 17:28
→ angleevil:它實際上是用物件(lhs)呼叫operator+.然後用rhs當參數 11/16 17:30
→ shadow0326:那基本上還是是否滿足交換率的問題吧, 和結果的關係是? 11/16 17:30
→ angleevil:你可以參考tropical72的解釋.y.operator+(obj);<-- 11/16 17:34
→ angleevil:而且2A說過了左邊的運算元一定是所屬的物件. 11/16 17:36
推 tropical72:回文討論吧,推文裡的東西版上都還沒有,可以討論很久. 11/16 17:39
→ shadow0326:我覺得有點鬼打牆了 XD 我知道operator的呼叫方式, 也 11/16 17:42
→ shadow0326:理解建議non-memeber的理由 (後者要感謝t大和a大) 11/16 17:42
→ shadow0326:我只是想說non-member可能付出的代價(implict的問題) 11/16 17:43
→ shadow0326:以及是否有必要為了滿足交換率特地寫兩條實作幾乎相同 11/16 17:44
→ tropical72:我能理解 shadow0326 考量在哪,但那問題在複載二元運算 11/16 17:44
→ shadow0326:的overload. (當然我支持有些時候non-member真的較好) 11/16 17:45
→ tropical72:子時就一定要考量,甚至必要時也會提供 static_cast<T> 11/16 17:45
→ tropical72:之複載. 11/16 17:45
→ angleevil:shadow0326,我引用tropical72的例子來解釋理由,看看還有 11/16 17:48
→ angleevil:疑問嗎? 也希望其他人幫忙多找問題和回答 11/16 19:28
※ 編輯: angleevil 來自: 61.220.204.217 (11/17 08:25)
※ 編輯: angleevil 來自: 61.220.204.217 (11/17 11:35)
推 cgcheng:幾乎同樣的實作?func(lhs,rhs){ func(rhs,lhs) } 11/18 04:47
→ cgcheng:看這樣會不會好點,加個兩行滿足需求 11/18 04:48
推 cgcheng:implict的問題是比較麻煩點,不過根據use case好像可以避開 11/18 04:52
→ angleevil:樓上可以講解更清楚嗎?直接給func(lhs,rhs)不知是member 11/18 07:14
→ angleevil:or nonmember case? 還是說用一個member function的功能 11/18 07:15
→ angleevil:取代operatior overloading? ><而且我不太知道use case 11/18 07:19
→ angleevil:的意思是什麼? 麻煩大家解惑一下 11/18 07:19
推 shadow0326:我想c大的意思是例如 operator + (l,r){return r+l} 11/18 10:18