C_and_CPP 板


LINE

寫一個建構子 Foo(ICallback* callback) : mCallback(callback){ assert(mCallback); } 被問說那為什麼你mCallback不用reference 然後Foo就開成(ICallback&)就好 我不想這樣改 但我沒有強力的說法比較出哪一種比較好或是合理 我的看法 用ref, caller勢必要*ptr 做dereference才能傳進來 雖然說reference 可以當作non null去操作 但有心要傳*null也不是不行. 開reference 給別人傳,比起pointer更有機會caller不小心傳入local variable 以上都可以用一句話“哪有人會這樣寫”來否定用pointer存. 而用reference 可以給人一種 必定要想辦法生出一個物件才能呼叫的感覺... 實在想不到哪個時候 用reference 才是合理的寫法. 反而我自己是很少看過member 用reference去存... 不知道大家在design上會有什麼考量 謝謝 --



※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 39.8.8.45
※ 文章網址: https://webptt.com/m.aspx?n=bbs/C_and_CPP/M.1532344601.A.2C0.html ※ 編輯: lovejomi (39.8.8.45), 07/23/2018 19:36:57
1F:→ sarafciel: 我覺得你把物件變數的記憶體控管交出去就開始錯了 07/23 19:47
2F:→ sarafciel: 要嘛寫member function把生member variable的部分封裝 07/23 19:51
3F:→ sarafciel: 起來給使用者call 要嘛丟進來的東西你自己再new一塊做 07/23 19:52
4F:→ sarafciel: copy 07/23 19:53
5F:推 AstralBrain: 我覺得smart pointer唯一解 07/23 20:21
6F:推 BlazarArc: 沒有說明Foo跟ICallBack的生命週期跟擁有權沒辦法回答 07/23 20:26
7F:→ BlazarArc: 你的看法那段的理由我覺得還蠻弱的 我會預設用ref 07/23 20:28
8F:→ BlazarArc: 不用ref的理由, class需要被copy 07/23 20:28
9F:→ lovejomi: 生命周期都比這class本身久, 我知道理由很弱,但我很 07/23 20:32
10F:→ lovejomi: 難描述我不想用ref的理由,總覺得不夠彈性 07/23 20:32
11F:→ sarafciel: 阿對還有smart pointer這個解 我老了QQ 07/23 22:15
12F:→ nobodycares: std::function 選我正解好嗎 07/23 22:40
13F:→ Killercat: 你要考慮callback生命週期 用reference傳入的話 07/23 23:35
14F:→ Killercat: 其實有很高的機率會發生人為錯誤 07/23 23:35
15F:→ Killercat: pointer除非耍蠢 很不自然的傳一個local variable的 07/23 23:36
16F:→ Killercat: pointer進來 不然基本上不太會出包 但ref機率高得多 07/23 23:36
17F:→ Killercat: 另外 smart pointer是通用解沒錯... 07/23 23:37
18F:推 eye5002003: 我的習慣是如果會改變外部狀態就用指標,使用但是不會 07/24 00:44
19F:→ eye5002003: 去改變外部就用ref(常常搭配const來保證不會修改) 07/24 00:45
20F:推 eye5002003: 還需要擔心生命週期的情況就都用std::shared_ptr處理 07/24 00:50
21F:推 ketrobo: ref比較好,B(A&),如果正確依照物件生命週期設計,乾淨的 07/24 02:23
22F:→ ketrobo: 程式結構會是B先結束,之後才是A結束,用pointer會變成語 07/24 02:23
23F:→ ketrobo: 法上少了限制,隨便寫都會產生cyclic dependency的問題, 07/24 02:23
24F:→ ketrobo: 造成物件生命週期結束這塊非常難寫,然後系統資源沒釋放 07/24 02:23
25F:→ ketrobo: 完,浪費工程師的生命在找問題,最後跟你說解決的辦法是定 07/24 02:23
26F:→ ketrobo: 期reset整臺機器…簡單講B(A&)很自然就從語法上讓你設計 07/24 02:23
27F:→ ketrobo: 出遵循著RAII的程式結構 07/24 02:23
28F:→ tinlans: 從語法層級探討很沒意義,高興怎樣就怎樣啊,真非要用 07/24 05:47
29F:→ tinlans: reference 還有 reference_wrapper 可以活用。 07/24 05:47
30F:→ tinlans: 正確來講還是要從生命週期去探討,用更高階抽象的概念來 07/24 05:48
31F:→ tinlans: 說就是 aggregation 跟 composition 的差異。 07/24 05:48
32F:→ tinlans: 如果對這兩個名詞陌生,可能要去補足一下 OOAD 的知識。 07/24 05:49
33F:→ tinlans: 身為一名工程師,設計圖之類的當然要會畫,然後按圖施工 07/24 05:50
34F:→ tinlans: ,今天會有這種問題跑出來就是因為你沒圖。 07/24 05:50
35F:推 andyjy12: reference 不能直接更換綁定對象 07/28 12:57







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:BabyMother站內搜尋

TOP