[問題] 同樣method的const與non-const版本該如 …

看板C_and_CPP作者 (上大學好忙喔)時間14年前 (2010/05/10 02:03), 編輯推噓3(3016)
留言19則, 7人參與, 最新討論串1/1
( *[1m *[m 為色碼,可以按 Ctrl+V 預覽會顯示的顏色 ) ( 未必需要依照此格式,文章條理清楚即可 ) 遇到的問題: (題意請描述清楚) 對於同樣的method,我希望他有const跟non-const版本(STL很多container都有這種東西) 應該要如何實做而不用把一樣的程式碼多撰寫一次? 開發平台: (例: VC++ or gcc/g++ or Dev-C++, Windows or Linux) ANSI C++ 有問題的code: (請善用置底文標色功能) class A{ int f() const; int f(); }; 這兩個method該如何實做一份就好? 補充說明: 會有這樣的需求其實是因為 我有一個功能 我希望他達成這樣的目的:(T表示某個type) class A{ public: const T& f() const; protected: T& f(); } 也就是外人只能讀取 而不能透過這個function的reference來修改我的內容 我嘗試過 const T& A::f() const{ return f(); } T& A::OAf(){ /*...*/ } 這樣的形式 但是這樣不可能成功阿.....||| 就算是反過來讓non-const的method去call const的method 似乎也有一樣的問題 都是遞迴....而不會真的去call到另外一個 就算用上const_cast好像也怪怪的.... 我想不通該如何實做才是比較正確的方法 麻煩各位指教一下 謝謝! -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.116.154.30 ※ 編輯: CrBoy 來自: 140.116.154.30 (05/10 02:06)

05/10 02:26, , 1F
加一個 private 的 T& A::real_f() const 寫實作如何?
05/10 02:26, 1F

05/10 02:42, , 2F
寫實作+1, 包起來應該就可以了
05/10 02:42, 2F

05/10 07:33, , 3F
不可能 (最多只有一部份可以重用)
05/10 07:33, 3F

05/10 07:34, , 4F
原因很簡單. const 不會改變成員, non-const 會改變.
05/10 07:34, 4F

05/10 10:54, , 5F
你去看 vector 怎麼實做兩種 begin() 就知道了. 做兩份吧
05/10 10:54, 5F

05/10 12:08, , 6F
看看effective C++ 3rd有提到..利用const_cast
05/10 12:08, 6F

05/10 12:10, , 7F
不好意思沒看到最後第二行,不過我想是可行的
05/10 12:10, 7F

05/10 12:10, , 8F
抱歉手上沒書@"@
05/10 12:10, 8F

05/10 13:03, , 9F
non-const 版本只有物件本身不是 const 才會 call 進去,
05/10 13:03, 9F

05/10 13:03, , 10F
所以在裡面怎樣 const_cast 都是 safe 的。
05/10 13:03, 10F

05/10 13:03, , 11F
non-const 可以寫 const_cast<const A *>(this)->f();
05/10 13:03, 11F

05/10 13:04, , 12F
呼叫 const 版本。
05/10 13:04, 12F

05/10 13:04, , 13F
而 f 傳回 const reference 的話,
05/10 13:04, 13F

05/10 13:05, , 14F
non-const 的版本也能放心的用 const_cast 拔掉 const。
05/10 13:05, 14F

05/10 13:08, , 15F
至於是否能夠只實作一份,這取決於是否兩個版本都是唯讀。
05/10 13:08, 15F

05/10 13:08, , 16F
如果兩個版本都不會修改 data member,只實作 const 版本
05/10 13:08, 16F

05/10 13:08, , 17F
就好了。
05/10 13:08, 17F

05/13 02:09, , 18F
感謝!我剛剛已經閱讀過Effective C++ 3rd的條款三了,
05/13 02:09, 18F

05/13 02:10, , 19F
與tinlans所提供的方法是一樣的,也符合我的需求,謝謝!:)
05/13 02:10, 19F
文章代碼(AID): #1BvlZMbg (C_and_CPP)