[問題] 想要有全域變數效果但是能控制lifetime

作者: ofd168 (大色狼來襲)   2020-06-02 21:09:42
開發平台(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時候順便檢查
但如果更多人開發,或是不夠自律的話,勢必還是需要一些保護措施
想問,實務上都是怎麼處理?
作者: firejox (Tangent)   2020-06-02 21:23:00
你全域的東西會半途死掉?
作者: ddavid (謊言接線生)   2020-06-02 22:02:00
我不太懂原Po你的邏輯,如果這變數一次就死了,那你函數第二次執行到時去參考該變數該怎麼辦?如果連函數都肯定只會執行一次,那就你自己提到包個class處理,用完class實體砍掉。如果你只是怕該變數值用完後被繼續偷用,那就確定用完時塞null之類的給它啊,然後函數裡面去參考該變數時看到null就表示用過了,不該進行需要參考它的處理如果這種變數有很多個,通通塞一起弄個結構,全域開個指標來指它的使用中實體,用完釋放掉指標給NULL,同上述處理
作者: loveme00835 (髮箍)   2020-06-02 23:50:00
看起來像是 template method 不過在存取端一定會有相依性問題, 變成在 type erasure 或是 dynamic polym-orphism 之間做取捨你需要的是明確定義流程, 而其他重覆的程式碼都可以透過 CRTP 預先在 base class 定義好https://wandbox.org/permlink/6lqqEHTxC7AHkT6V雖然 RAII 可以做到類似的功能, 但因為編譯器允許把dtor call 給 optimize 掉, 所以把 side-effect 放在dtor 裡完成是比較不保險的做法上面程式碼少加 virtual dtor 在 base 裡
作者: ddavid (謊言接線生)   2020-06-03 11:14:00
所以其實原Po你要做就類似單元測試多個test cases是吧?是不是直接去找一些單元測試的framework看看其特性是否符合你的需求,單元測試framework基本上應該都有test case互不干擾的處理,也許就是你要的?
作者: peter200567   2020-08-02 15:06:00
暫且不論教育部的挹注資金,長庚大學的校務基金就高達
作者: Turtle100 (龜龜100)   2020-08-02 15:08:00
2元
作者: peter200567   2020-08-02 15:08:00
300多億,也因此學校很敢給錢,聽到許多碩班學生每個
作者: Jeanime (偷偷)   2020-08-02 15:08:00
就射了
作者: flarehunter (Range)   2020-06-03 17:35:00
聽起來很像GoogleTest的testing::Environment class或是parameterized test
作者: ofd168 (大色狼來襲)   2020-06-03 23:12:00
感謝樓上幾位大大,我研究研究

Links booklink

Contact Us: admin [ a t ] ucptt.com