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

看板C_and_CPP作者時間4年前 (2020/06/02 21:09), 4年前編輯推噓3(3024)
留言27則, 5人參與, 4年前最新討論串1/1
開發平台(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時候順便檢查 但如果更多人開發,或是不夠自律的話,勢必還是需要一些保護措施 想問,實務上都是怎麼處理? --

08/02 15:06,
暫且不論教育部的挹注資金,長庚大學的校務基金就高達
08/02 15:06

08/02 15:08,
2元
08/02 15:08

08/02 15:08,
300多億,也因此學校很敢給錢,聽到許多碩班學生每個
08/02 15:08

08/02 15:08,
就射了
08/02 15:08
-- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 60.250.204.170 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1591103390.A.916.html

06/02 21:23, 4年前 , 1F
你全域的東西會半途死掉?
06/02 21:23, 1F

06/02 22:02, 4年前 , 2F
我不太懂原Po你的邏輯,如果這變數一次就死了,那你函數第
06/02 22:02, 2F

06/02 22:02, 4年前 , 3F
二次執行到時去參考該變數該怎麼辦?
06/02 22:02, 3F

06/02 22:03, 4年前 , 4F
如果連函數都肯定只會執行一次,那就你自己提到包個class
06/02 22:03, 4F

06/02 22:04, 4年前 , 5F
處理,用完class實體砍掉。
06/02 22:04, 5F

06/02 22:05, 4年前 , 6F
如果你只是怕該變數值用完後被繼續偷用,那就確定用完時塞
06/02 22:05, 6F

06/02 22:05, 4年前 , 7F
null之類的給它啊,然後函數裡面去參考該變數時看到null就
06/02 22:05, 7F

06/02 22:06, 4年前 , 8F
表示用過了,不該進行需要參考它的處理
06/02 22:06, 8F

06/02 22:07, 4年前 , 9F
如果這種變數有很多個,通通塞一起弄個結構,全域開個指標
06/02 22:07, 9F

06/02 22:08, 4年前 , 10F
來指它的使用中實體,用完釋放掉指標給NULL,同上述處理
06/02 22:08, 10F
感謝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

06/02 23:50, 4年前 , 11F
看起來像是 template method 不過在存取端一定會有相
06/02 23:50, 11F

06/02 23:51, 4年前 , 12F
依性問題, 變成在 type erasure 或是 dynamic polym-
06/02 23:51, 12F

06/02 23:51, 4年前 , 13F
orphism 之間做取捨
06/02 23:51, 13F
感謝 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

06/03 00:23, 4年前 , 14F
你需要的是明確定義流程, 而其他重覆的程式碼都可以
06/03 00:23, 14F

06/03 00:24, 4年前 , 15F
透過 CRTP 預先在 base class 定義好
06/03 00:24, 15F

06/03 00:24, 4年前 , 16F

06/03 00:41, 4年前 , 17F
雖然 RAII 可以做到類似的功能, 但因為編譯器允許把
06/03 00:41, 17F

06/03 00:42, 4年前 , 18F
dtor call 給 optimize 掉, 所以把 side-effect 放在
06/03 00:42, 18F

06/03 00:42, 4年前 , 19F
dtor 裡完成是比較不保險的做法
06/03 00:42, 19F

06/03 00:47, 4年前 , 20F
上面程式碼少加 virtual dtor 在 base 裡
06/03 00:47, 20F

06/03 11:14, 4年前 , 21F
所以其實原Po你要做就類似單元測試多個test cases是吧?
06/03 11:14, 21F

06/03 11:16, 4年前 , 22F
是不是直接去找一些單元測試的framework看看其特性是否符
06/03 11:16, 22F

06/03 11:17, 4年前 , 23F
合你的需求,單元測試framework基本上應該都有test case互
06/03 11:17, 23F

06/03 11:17, 4年前 , 24F
不干擾的處理,也許就是你要的?
06/03 11:17, 24F

06/03 17:35, 4年前 , 25F
聽起來很像GoogleTest的testing::Environment class
06/03 17:35, 25F

06/03 17:38, 4年前 , 26F
或是parameterized test
06/03 17:38, 26F

06/03 23:12, 4年前 , 27F
感謝樓上幾位大大,我研究研究
06/03 23:12, 27F
文章代碼(AID): #1Ura-UaM (C_and_CPP)