Re: [問題] 關於 return reference

作者: xacid ( )   2014-05-20 15:30:02
: 推 wowslr:我想問一下,一般在設計 getter ,如果沒有特別需要 const 05/19 22:30
: → wowslr:也都是提供const和non-const兩個版本嗎?或是有其他寫法? 05/19 22:31
這個問題下面幾位高手都有提出一些看法,
小弟也就順著問題多說一些,如果離題請多包涵。
: 推 xacid:如果是回傳ref/ptr to member,我都直接提供none-const 05/20 02:43
: → xacid:因為傳出去就是為了方便而破壞封裝,有沒有const差不多 05/20 02:44
: 推 LPH66:相對的如果是以值回傳的話則通常會掛 const 05/20 08:15
: → LPH66:(我是指 const member function) 這樣方便使用 05/20 08:15
: → kingofsdtw:請問一下FOO是啥@@? 05/20 11:27
: → MOONRAKER:foo是電腦語言界的小明 foo()就是小明函數 05/20 11:33
: → Killercat:原來有人回了 我會建議提供兩個getter 05/20 13:36
: → Killercat:這樣要debug會有意想不到的妙用 05/20 13:37
: → uranusjr:以我個人而言, 不是「沒有特別需要 const」就不加, 而是 05/20 14:06
: → uranusjr:相反, 如果可以的話儘量用 const & 或者直接傳值, 除非必 05/20 14:06
: → uranusjr:要才會把 const 拿掉傳 non-const 參考或 pointer 05/20 14:07
單獨以原本的問題來說,回傳 ref to member 以後,本尊還是在原本的 owner 裡面。
那麼最大的問題是,萬一執行的時候本尊消失了,ref 就不能繼續使用。
這是呼叫 getter 的 caller 要特別避免的,也是盡可能不要提供這種 getter 的原因。
如果設計還是需要提供 getter,那麼 return type 有沒有加 const 修飾,
是用來限制 caller 能否修改。以上面 IDrive 的例子來說,加上 const 就是
只能呼叫 IDrive 的 const member function。這可能不是很實際,
因為 IDrive 可能不是我寫的,caller 可能也不是我寫的,不能滿足 const 條件。
或者未來改 code 真的需要改 IDrive... 這時候 const 就拔掉了。
當然一個好的設計不應該出現這種問題,比如 std::string::c_str() 也是 const
return const char* 也好好的。但是有時候不能為了一個新的 const 改一堆界面,
就會有犧牲。簡單的 type 也比較容易加上 const,因為比較不會有 member function
也需要 const,造成 const 傳染。
至於提供兩個 getter,那只是 overloading,還是要先決定單獨一個的情況,
才能說另外一個 getter 要作什麼。

Links booklink

Contact Us: admin [ a t ] ucptt.com