看板 C_and_CPP 關於我們 聯絡資訊
( *[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)
LPH66:加一個 private 的 T& A::real_f() const 寫實作如何? 05/10 02:26
loveme00835:寫實作+1, 包起來應該就可以了 05/10 02:42
firose:不可能 (最多只有一部份可以重用) 05/10 07:33
firose:原因很簡單. const 不會改變成員, non-const 會改變. 05/10 07:34
avhacker:你去看 vector 怎麼實做兩種 begin() 就知道了. 做兩份吧 05/10 10:54
tomap41017:看看effective C++ 3rd有提到..利用const_cast 05/10 12:08
tomap41017:不好意思沒看到最後第二行,不過我想是可行的 05/10 12:10
tomap41017:抱歉手上沒書@"@ 05/10 12:10
tinlans:non-const 版本只有物件本身不是 const 才會 call 進去, 05/10 13:03
tinlans:所以在裡面怎樣 const_cast 都是 safe 的。 05/10 13:03
tinlans:non-const 可以寫 const_cast<const A *>(this)->f(); 05/10 13:03
tinlans:呼叫 const 版本。 05/10 13:04
tinlans:而 f 傳回 const reference 的話, 05/10 13:04
tinlans:non-const 的版本也能放心的用 const_cast 拔掉 const。 05/10 13:05
tinlans:至於是否能夠只實作一份,這取決於是否兩個版本都是唯讀。 05/10 13:08
tinlans:如果兩個版本都不會修改 data member,只實作 const 版本 05/10 13:08
tinlans:就好了。 05/10 13:08
CrBoy:感謝!我剛剛已經閱讀過Effective C++ 3rd的條款三了, 05/13 02:09
CrBoy:與tinlans所提供的方法是一樣的,也符合我的需求,謝謝!:) 05/13 02:10