[問題] 請問C++ 的const_cast

看板C_and_CPP作者 (tedium of chores)時間13年前 (2010/12/20 18:19), 編輯推噓3(3037)
留言40則, 7人參與, 最新討論串1/1
class A: base class class B: derived class class B 有一個data member 是STL 的list, list<A> la; class B 其中一個 member function 是這樣 A * B::getstring(const string& inputstring) const { for ( list<A>::const_iterator i = la.begin(); i !=la.end(); i++ ) { if (xxxx) return const_cast<A *>(&(*i)); } return 0; } 1. 請問這串噁心的cast 該怎麼讓他比較美麗 @@" 比對值之後,目的在output 出list 內正確結果的address 才寫出這麼噁心的東西 2. 而考量到可能找不到 所以把return 定為A * 以便回傳null(0) 的方式讓上層再去作處理 請問這有更好得作法嗎?? -- 喔 謝懇油錫白德到惡靈來 花縮泡的列為孩兒也的退來累蛤蜊名?胡適播的是 ▄▄翠亨不來十大輸入的噴你耳屎飯 偶爾的覽啪味彎曲的我搜給人特例死稱哩? 安得羅技四銳個劣惡的蹦爸死停因爺兒 給夫普褥輸入的奶店傲夫挖屎屎滴碟兒 ((喔 謝的店屎大屎便夠搬挪也為乎 偶而的練我夫的匪類恩德宏我夫的不累夫?)) -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.117.169.209 ※ 編輯: POSIX 來自: 140.117.169.209 (12/20 18:25)

12/20 18:53, , 1F
那幹嘛不 return const A*?
12/20 18:53, 1F

12/20 18:56, , 2F
這部份我不熟, 所以 .... 是該朝這個方向去找解法嗎 @@
12/20 18:56, 2F

12/20 18:57, , 3F
我覺得, 如果你要用const_cast把那個item的constness給
12/20 18:57, 3F

12/20 18:58, , 4F
去掉, 你這個function宣告成const本身就有點小毛病 因
12/20 18:58, 4F

12/20 18:59, , 5F
為這個function有可能造成object的(bitwise?)constness
12/20 18:59, 5F

12/20 18:59, , 6F
改變.
12/20 18:59, 6F

12/20 18:59, , 7F
希望我沒弄錯你的意思@@"
12/20 18:59, 7F

12/20 19:06, , 8F
喔喔喔~~ 主要是la這個container 在這function 內我不想改
12/20 19:06, 8F

12/20 19:06, , 9F
動他的內容, 所以配合const func 用const_iterator 來作
12/20 19:06, 9F

12/20 19:07, , 10F
可是從const func 牽動const_iterator, 再影響到return val
12/20 19:07, 10F

12/20 19:08, , 11F
就好像會這麼噁心 似乎是要用return const value 方式才合理
12/20 19:08, 11F

12/20 19:41, , 12F
你的簽名檔是不是米国国歌《星條旗》?
12/20 19:41, 12F

12/20 19:42, , 13F
=_=" 第一次有人發現 ..... 這麼噁心的歌詞你也看得懂
12/20 19:42, 13F

12/20 19:45, , 14F
以前的簽名檔也有中華民國國旗歌不是 XD
12/20 19:45, 14F

12/20 19:54, , 15F
米国国歌《星條旗》http://0rz.tw/XCLON 先生小姐請起立!
12/20 19:54, 15F

12/20 20:31, , 16F
推三樓講的那邊,已經是const function語意上就要做到
12/20 20:31, 16F

12/20 20:31, , 17F
不然其實怪怪的@@"
12/20 20:31, 17F

12/20 20:38, , 18F
如果我把這func宣告程 const A* func() const { } 的方式
12/20 20:38, 18F

12/20 20:39, , 19F
func內的 const_iterator所指到obj 要cast成為 const A*
12/20 20:39, 19F

12/20 20:39, , 20F
這樣的作法對嗎??
12/20 20:39, 20F

12/20 20:41, , 21F
還是說 我用cast把事情想簡單了!!!(英雄 陳道明口氣)
12/20 20:41, 21F

12/20 20:42, , 22F
換成宣告一個ptr, 把他當作最後回傳用 和iterator做的事情
12/20 20:42, 22F

12/20 20:42, , 23F
分開來 這樣會不會比較好 @@"
12/20 20:42, 23F

12/20 20:48, , 24F
如果是const A* 你可以直接return &*i . 現在問題是, 你
12/20 20:48, 24F

12/20 20:48, , 25F
這個function的caller會不會更動那個A object? 我一開始
12/20 20:48, 25F

12/20 20:48, , 26F
的推文的意思就是, 如果return的A object是會被亂搞的,
12/20 20:48, 26F

12/20 20:49, , 27F
你這個function就不能確保(bitwise) constness, 就不適
12/20 20:49, 27F

12/20 20:49, , 28F
合宣告為const function. 當然, 如果你想要/需要那個
12/20 20:49, 28F

12/20 20:49, , 29F
被return的A object不會被亂搞, 宣告成const pointer是
12/20 20:49, 29F

12/20 20:49, , 30F
個不錯的作法.
12/20 20:49, 30F

12/20 21:00, , 31F
soga, 這樣我大概懂了!!! 感謝各位推文大大
12/20 21:00, 31F

12/20 21:19, , 32F
我的作法可能是在找不到的時候 throw 一個 exception
12/20 21:19, 32F

12/20 21:25, , 33F
excpetion +1 找不到最好還是用例外, 硬要回傳值光想
12/20 21:25, 33F

12/20 21:27, , 34F
出不合法的標兵值就夠你想的, 之前看到一份stack<T>
12/20 21:27, 34F

12/20 21:29, , 35F
pop() 回傳 (T)NULL; 當 T=string, 你知道的...作者
12/20 21:29, 35F

12/20 21:29, , 36F
還用噁心的特化來解決這問題
12/20 21:29, 36F

12/20 21:39, , 37F
throw 的方式不錯!!!
12/20 21:39, 37F

12/20 21:44, , 38F
我不敢想像那噁心的T的偏特化 ~"~
12/20 21:44, 38F

12/20 21:47, , 39F
其實我上面例子所犯的似乎是effective c++ 提到的
12/20 21:47, 39F

12/20 21:47, , 40F
avoid returning "handles" to internal data.
12/20 21:47, 40F
文章代碼(AID): #1D3otDtS (C_and_CPP)