作者lovejomi (JOMI)
看板C_and_CPP
标题[问题] 什麽时後 不该用/该用reference当member
时间Mon Jul 23 19:16:39 2018
写一个建构子
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/cn.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