看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《angleevil (human)》之銘言: 恕刪。 : 參考資料 : 1.http://www.cs.uregina.ca/Links/class-info/210/Overloading/membervsregular.html : 2.http://www.programmer-club.com.tw/ShowSameTitleN/c/31905.html : 3.Exceptional C++ 國際中文版: 47個工程難題`編程疑問`及其解決方法/Herb Sutter原著;侯捷 譯 我也是初學者,一起探討一下。 焦點放在下面這問題,我持有一點點不同見解。 class overload operator 時,該以 member function 實作, 或以 global overload operaotr 方式實作? 上篇例子曾以此例做引述,並以加法為例。 double x, y; Object obj; 簡化一點問題,不考慮 pointer、template, 想法如下。 <case 1> x = obj + y; (pod = class + pod) x = obj.operator+(y); 必須提供 member function double Object::operator+(const Object& rhs) const; <case 2> x = y + obj; (pod = pod + class) x = y.operator+(obj); // double = double.operator(object) ?? 必須提供 global overload double operator+(double, const Object& rhs); 上面 case 1, case 2 本身並不衝突,可以只提供 case1 , 但這樣做真的很怪!目前看過的公用 class ,有哪個是只提供 1 不提供 2 的嗎? 拿 string class 為例。 const char* c_style = "c style"; string cpp_style="cpp style", rst; 這種 class 總不能只限定 rst = cpp_style + c_style 吧 ? 而 case 1 的確也可用 global overload operator 方式完成, 但 case 2 就一定只能用 global overload operator 方式完成。 ( 除非 case 2 裡面的 double 又是另一 class type, 另當別論) 但總而言之是,只 overload 一種真的是件奇怪的事, 重點是有些情況下,就一定要兩種都要提供, 特別是像這種情況出現的時候 double x, y, z; object o1, o2, o3; z = x + o1 + y + o2 + o3; 還是要改成這樣 ? z = o1 + o2 + o3 + x + y 這麼寫還是會出包唷 (1) 先看 o1+o2 double tmp = o1+o2; tmp = o1.operator+(o2); (2) 再看 o1 + o2 + o3 double tmp2 = o1 + o2 + o3 = tmp + o3; tmp2 = tmp.operator+(o3); /* double = double.operator(object) */ 還是硬要叫別人把這一行,在呼叫的時候寫成這樣? double t1= x + y; double t2= o3 + t1; double t3= o2 + t2; double z = o1 + t3; 如果這樣可接受的話,那就只做 case 1 吧, (我只能為 co-worker 的 partner 默哀) 遇到這種情況的話,最終還是兩種都要 overload 。 而且上面用到的還是 double (POD),如果今天遇到的是 class A + class B 又更麻煩, 這也不是用 member function 就適合解決的事, 故可能還是該 case by case 方式下去探討較為合適。 此篇只作拋磚引玉之效,期待更多高人予以指教。 -- No matter how gifted you are, alone, can not change the world. -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 180.177.78.41 ※ 編輯: tropical72 來自: 180.177.78.41 (11/16 20:42)
angleevil:其實那篇的作者所提出的問題就在這,總不能要求user 11/16 20:48
angleevil:永遠都只用case1.至於有人提到隱形轉換的問題. 11/16 20:49
angleevil:作者其實是用operator overloading去解決. 11/16 20:50
angleevil:最大的問題在我目前還沒有能力舉簡單的例子一一說明 11/16 20:52
angleevil:第三點各自的例子.作者書上有提.可是我無法濃縮它 11/16 20:53
angleevil:而且同時使用member function和non-member function問題 11/16 20:53
angleevil:在實作時,其實還是以member function為主. 11/16 20:54
diabloevagto:a大看那本書是在第幾條看到的? 11/16 22:13
yoco315:可以重新再讀一次 angleevil 的文章,仔細讀 11/17 01:14
angleevil:to 哆啦a夢 第20條 class技術,to yoco315 我是之後引用 11/17 08:20
angleevil:t大的例子. 不過他舉的例子也不錯 11/17 08:21