看板 C_and_CPP 關於我們 聯絡資訊
: 推 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 要作什麼。 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 218.161.54.33 ※ 文章網址: http://www.ptt.cc/bbs/C_and_CPP/M.1400571005.A.718.html ※ 編輯: xacid (218.161.54.33), 05/20/2014 15:47:00