C_and_CPP 板


LINE

标题不好下 主要问题是 一个class被标注 copy constructor = delete的时候 我却透过by value的语意 使用他 具体code 我用lock_guard<...>来举例 https://wandbox.org/permlink/kNmQm9tWjXAJEbVH 看到不少code, 有人这样使用 lock_guard<mutex> getLock(){return lock_guard<mutex>{m};} 这种code 贴到ideone C++14就不给过 两个问题 1. 因为C++17 copy elision, 这种使用方式 是完全没问题的吗? 2. 假设没问题, 因为只有C++17後才能这样写, 我自己会觉得宁可不要写这种 code 尽量维持 backward compatible. 3. 如果好的包法 要怎麽做呢? 以前通常是把get set包出去 内部用lock去r/w member struct { void GetX(){ lock_guard...} void SetX(...){lock_guard....} private: int x; mutex m; } 但这样变成 要提供get/set... 所以我猜才会有人想要提供一个RAII Locker的getter 让外面先acquire lock 直接把member public出去给外面操作 该怎麽做比较好呢? 谢谢 --



※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 39.12.30.36 (台湾)
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1598931374.A.FDE.html
1F:→ Lipraxde: https://stackoverflow.com/questions/43546213 09/01 12:19
2F:→ Lipraxde: 提供 lock、unlock 09/01 12:20
3F:→ Lipraxde: 是说 getLock 这样写好怪,有连结可以让我观摩一下吗? 09/01 12:21
4F:→ lovejomi: 没有连结耶 内部的code 不只一个人这样写 @@ 09/01 12:30
5F:→ Lipraxde: 可能第一个人写下去後後面的接着抄吧... 09/01 18:18
6F:→ lovejomi: 也许是这样 但我是想探讨 这种方式是否没任何问题,如果 09/01 19:40
7F:→ lovejomi: 没有 这感觉很钻漏洞的感觉 09/01 19:40
8F:→ Lipraxde: 我是觉得不行啦,写这种意图怪怪的 code... 09/01 20:50
9F:→ loveme00835: 你先想写类别的目的是什麽? 是提供抽象化. 而 mutex 09/02 00:04
10F:→ loveme00835: 目的就是要确保抽象化有被达成, 具体来说就是物件的 09/02 00:05
11F:→ loveme00835: 状态改变不会有意外发生. 你为了 mutex 反而增加和类 09/02 00:06
12F:→ loveme00835: 别责任无关的方法, 你同事都不会觉得奇怪吗? 一般有 09/02 00:07
13F:→ loveme00835: mutex 也会经过封装, 让使用者传入 callback 来间接 09/02 00:09
14F:→ loveme00835: 存取物件, 实作可以参考 boost::with_lock_guard(), 09/02 00:10
15F:→ loveme00835: 多做一层封装在之後确定存取都在同一个 thread 之後 09/02 00:35
16F:→ loveme00835: 也可以直接把 mutex 拿掉, client code 不需要做调整 09/02 00:35
17F:→ loveme00835: 所以你会看到有些函式库进 critical section 是给 09/02 00:37
18F:→ loveme00835: callback 而不是明确地写 lock 叙述 09/02 00:37
19F:→ loveme00835: https://wandbox.org/permlink/zLuj9ynXtafalAYi 09/02 00:38
20F:→ loveme00835: 当你在传东西给 callback 的时候, 最好是用限缩後的 09/02 00:46
21F:→ loveme00835: 介面, 看是要用 std::forward_as_tuple() 或是允取存 09/02 00:48
22F:→ loveme00835: 取的成员放在 base class 内, 再怎麽样都不会搞到把 09/02 00:48
23F:→ loveme00835: 所有成员都变成 public, 那这样你还写 C++ 干嘛呢 09/02 00:49
24F:→ lovejomi: 抱歉我没有跟上 请问写一个Access inner class有什麽 09/03 10:25
25F:→ lovejomi: 好处吗? 为什麽不直接散装getX/setX在Foo就好? 09/03 10:25
26F:→ lovejomi: 我还没理解精随~ 这样看起来caller必须多.access() 09/03 10:26
27F:→ lovejomi: 如果有多个data member也是必须开getA getB 多个嘛? 09/03 10:26
28F:→ loveme00835: https://wandbox.org/permlink/PF98F9AhlvpqsIgr 09/03 11:08
29F:→ loveme00835: 不做特别处理的单个成员 setter/getter 还不如不写 09/03 11:10
30F:→ loveme00835: access 是一个概念, 虽然本来的物件无法复制, 但存取 09/03 11:10
31F:→ loveme00835: 权是可以被任意复制转移的, 这是 OO 的设计, 仔细思 09/03 11:11
32F:→ loveme00835: 考一个问题: 如果一个物件只允许你存取部分的资料成 09/03 11:12
33F:→ loveme00835: 员, 那存取的介面是否应该直接开在这个类别里? 还是 09/03 11:12
34F:→ loveme00835: 把 "特定资料成员的存取权" 这个概念抽象化出来, 未 09/03 11:14
35F:→ loveme00835: 如果要做 composition 也可以做在这个 Access 类别 09/03 11:15
36F:→ loveme00835: 里, 和目标物件无关 09/03 11:16







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灯, 水草

请输入看板名称,例如:WOW站内搜寻

TOP