作者ofd168 ()
看板C_and_CPP
标题[问题] 想要有全域变数效果但是能控制lifetime
时间Tue Jun 2 21:09:42 2020
开发平台(Platform): (Ex: Win10, Linux, ...)
win10
编译器(Ex: GCC, clang, VC++...)+目标环境(跟开发平台不同的话需列出)
VC++
问题(Question):
1. 我有些参数,想要让全部的function都能看的到
但是希望控制其life time
这个问题跟我上一篇很类似
我想要让某个global object里面的object执行某个function
但是因为变数众多,而且我需要执行的次数只需要一次
所以我想说塞到destructor
但是发现因为是global variable,destructor会最後才跑,
我希望我能控制其被执行时间,也就是控制其lifetime
换句话说,我比较想要是local variable(可以控制何时死掉),
但是却想让所以function都看的到
目前想到是
(1) global设一个指标,在function内宣告变数,
并将此指标指向这个local variable
(2) 当成input参数,一层一层往下丢,但是因为包了好几层,这修改起来颇麻烦
优点是可以定义那些function内部不可修改 (前面加const)
2. 想问,一般这种大家都要看的到的系统资料大家是怎麽处里的?
我目前的作法感觉是做半套
包成class,宣告成global variable,
利用member function来保护内部资料不可以被随意动到
但是变数一旦很多,每个都要弄成member function来读取,十分麻烦
目前是因为一起开发的人数不多,大家很自律不会乱搞,所以很多都没有另外包
大致上都是大家merge code时候顺便检查
但如果更多人开发,或是不够自律的话,势必还是需要一些保护措施
想问,实务上都是怎麽处理?
--
1F:→ peter200567:暂且不论教育部的挹注资金,长庚大学的校务基金就高达08/02 15:06
2F:推 Turtle100:2元08/02 15:08
3F:→ peter200567:300多亿,也因此学校很敢给钱,听到许多硕班学生每个08/02 15:08
4F:→ Jeanime:就射了08/02 15:08
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 60.250.204.170 (台湾)
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1591103390.A.916.html
5F:→ firejox: 你全域的东西会半途死掉? 06/02 21:23
6F:推 ddavid: 我不太懂原Po你的逻辑,如果这变数一次就死了,那你函数第 06/02 22:02
7F:→ ddavid: 二次执行到时去参考该变数该怎麽办? 06/02 22:02
8F:→ ddavid: 如果连函数都肯定只会执行一次,那就你自己提到包个class 06/02 22:03
9F:→ ddavid: 处理,用完class实体砍掉。 06/02 22:04
10F:→ ddavid: 如果你只是怕该变数值用完後被继续偷用,那就确定用完时塞 06/02 22:05
11F:→ ddavid: null之类的给它啊,然後函数里面去参考该变数时看到null就 06/02 22:05
12F:→ ddavid: 表示用过了,不该进行需要参考它的处理 06/02 22:06
13F:→ ddavid: 如果这种变数有很多个,通通塞一起弄个结构,全域开个指标 06/02 22:07
14F:→ ddavid: 来指它的使用中实体,用完释放掉指标给NULL,同上述处理 06/02 22:08
感谢F大 D大耐心看完,抱歉我表达能力很差Orz
概念上我想要
int main() {
for (int test_mode = 0; test_mode < 3; test_mode++)
test_func(test_mode);
return 0;
}
我想要在test_func内,每次进去都是乾净得进去,全部重新初始化
离开的时候死光光
但是里面很多系统参数,或是纪录结果用的class,会根据test_mode初始化
这些系统参数希望在test_func内部所有的function或class都要能够看的到,
能够读取
但我又希望,每一次进去test_func所有人都要重新来,避免不同test_mode结果混再一起
一种比较接近我想要的结果作法为
希望被所有人看到的变数弄成global variable
进去时候根据test_mode来做初始化
程式离开前,自己call function将结果存下来同时把所有空间都release
我原本想说如果可以自己控制变数的lifetime,同时也能满足大家都能看的到
这样最後call function的部分,甚至许多同一个class但是很多的object
原本要手动放在离开时的function内部存档,我只要放在destructor
这样新增变数时候,我只要改初始化的部分,存档的部分在destructor不用改
在自动存档的地方不需要自己而外加此新增的变数
我的疑惑在於,想要使用destructor就必须要离开test_func()时候死掉
所以应该要在test_func()内部定义成local variable
然而如果是local variable的话,test_func()内的其他function就必须透过
function input parameter传递
想要一些简单 方便,code容易维持与修改的方式
※ 编辑: ofd168 (59.102.231.161 台湾), 06/02/2020 23:31:38
15F:→ loveme00835: 看起来像是 template method 不过在存取端一定会有相 06/02 23:50
16F:→ loveme00835: 依性问题, 变成在 type erasure 或是 dynamic polym- 06/02 23:51
17F:→ loveme00835: orphism 之间做取舍 06/02 23:51
感谢 L大 Orz
上一篇得到L大解答後
目前朝向放弃使用destructor的方法
让所有人吃的参数与object都宣告成global variable
乖乖的进入test_func()时候初始化
要离开时,在最後一行执删除所有空间的function
搭配L大解法,利用define与apply()为每个object执行存档
※ 编辑: ofd168 (59.102.231.161 台湾), 06/03/2020 00:03:27
18F:→ loveme00835: 你需要的是明确定义流程, 而其他重覆的程式码都可以 06/03 00:23
19F:→ loveme00835: 透过 CRTP 预先在 base class 定义好 06/03 00:24
21F:→ loveme00835: 虽然 RAII 可以做到类似的功能, 但因为编译器允许把 06/03 00:41
22F:→ loveme00835: dtor call 给 optimize 掉, 所以把 side-effect 放在 06/03 00:42
23F:→ loveme00835: dtor 里完成是比较不保险的做法 06/03 00:42
24F:→ loveme00835: 上面程式码少加 virtual dtor 在 base 里 06/03 00:47
25F:推 ddavid: 所以其实原Po你要做就类似单元测试多个test cases是吧? 06/03 11:14
26F:→ ddavid: 是不是直接去找一些单元测试的framework看看其特性是否符 06/03 11:16
27F:→ ddavid: 合你的需求,单元测试framework基本上应该都有test case互 06/03 11:17
28F:→ ddavid: 不干扰的处理,也许就是你要的? 06/03 11:17
29F:推 flarehunter: 听起来很像GoogleTest的testing::Environment class 06/03 17:35
30F:→ flarehunter: 或是parameterized test 06/03 17:38
31F:→ ofd168: 感谢楼上几位大大,我研究研究 06/03 23:12