作者tropical72 (藍影)
看板C_and_CPP
標題Re: [分享] c++ member function 和 non-member function
時間Wed Nov 16 20:27:10 2011
※ 引述《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