[問題] 新增object時候,自動新增執行

看板C_and_CPP作者時間4年前 (2020/06/02 20:52), 4年前編輯推噓0(0010)
留言10則, 3人參與, 4年前最新討論串1/3 (看更多)
開發平台(Platform): (Ex: Win10, Linux, ...) win10 編譯器(Ex: GCC, clang, VC++...)+目標環境(跟開發平台不同的話需列出) VC++ 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...) c++11 問題(Question): 我有兩個class,分別是A和B 其中 class B { public: A a; A b; void save_info() { a.save(); b.save(); } } void main() { B obj_b; .... obj_b.save_info(); } 如果我要多一個c class B { public: A a; A b; A c; void save_info() { a.save(); b.save(); c.save(); } } 如果我想新增d/e/f/... 勢必就要改code 想說有沒有辦法比較聰明的方法修改save_info 目前想到簡單的做法是 1. 把a/b/c/d/.. 改成array,同時定義長度等等 然後save_info()裡面改成for-loop 不過因為a/b/c/d/.. 實際上是有意義的名稱 這部分想像上就是要自己另外去修改enum,把index轉成有意義的名稱 這讓這樣呼叫時候就會變成 enum { A_CAR, A_CAT, A_CANADA, A_NUM } class B { public: A A_arr[A_NUM]; void save_info() { for (int i = 0; i < A_NUM; A++) A_arr[i].save_info(); } } 使用時 obj_b.A_arr[A_CAR].func(); 2. 另外想法是 a/b/c/d記憶體使用應該是固定且相同的, 是不是有可能利用指標來自動掃位置並執行?? 3. 程式執行前,自動執行另一個小程式 掃描B.h來自動修改B.cpp,不過這感覺很多問題 且 save_info()可以能要另外放在一個檔案比較好修改 想問問有沒有其他做法? -- 標題 [笑話] 唐三藏的願望 唐三藏:八戒,你跑兩步給為師看看。 八 戒:師父,你為啥突然想看徒兒跑步? 唐三藏:哎啊!慚愧,為師自幼在寺中長大,既沒吃過豬肉,也沒看過豬跑步。

01/16 21:40,
我想你也沒被豬噓過
01/16 21:40
-- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 60.250.204.170 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1591102336.A.E3C.html

06/02 21:05, 4年前 , 1F
std::tie() + std::apply() 試試, 要更簡潔的話需要
06/02 21:05, 1F

06/02 21:05, 4年前 , 2F
用 preprocessor 展開
06/02 21:05, 2F

06/02 21:19, 4年前 , 3F
沒看到 void main() xD 你的 VC 是什麼版本?
06/02 21:19, 3F

06/02 21:38, 4年前 , 4F
也許是int ,我舉例子XD
06/02 21:38, 4F
嘗試改寫 1. 原本的 https://ideone.com/KU94fC 當我要新增變數時,需修改line 34 / 38 / 42 2. 改成使用Array + enum https://ideone.com/1Q92gH 當我要新增變數時,需修改 line 34 / 43 而 show_all_result 不需要動 3. std::tie() + std::apply() 研究中,目前是不太知道tie要怎麼應用在這裡 目前是朝向tuple + get + apply ---- 補,這部分有點玄之又玄,找範例研究中 ※ 編輯: ofd168 (59.102.231.161 臺灣), 06/02/2020 23:15:57

06/02 23:22, 4年前 , 5F
像這樣用 variadic template 遞迴展開即可
06/02 23:22, 5F

06/02 23:22, 4年前 , 6F

06/02 23:23, 4年前 , 7F
後來想想 <utility> 沒有現成工具也不打緊
06/02 23:23, 7F
喔喔,這個寫法真的不錯,感謝L大 延續我的1+2的話 https://ideone.com/pccF6Y 這樣的話,需要改line 49 / 58 但是優點是,code裡面不用弄成array方式 對我原本的code來說,改動最小,只要修改宣告的地方 其中有發生錯誤,我把 [](const A& a) { a.save(); }; 改成 [](A& a) { a.save(); }; 錯誤訊息是 error: passing ‘const A’ as ‘this’ argument discards qualifiers [-fpermissive] ※ 編輯: ofd168 (59.102.231.161 臺灣), 06/02/2020 23:55:36 補充 根據這篇解答 https://stackoverflow.com/questions/46190709/address-of-a-method-of-an-objec t-in-c 縮網址 : https://tinyurl.com/yckgwa42 原本想說c++有可以類似function pointer的東西 想說能不能類似使用 (func_ptr + obj_size) 直接切到下一個obj的function使用 但這篇有說明 有些編譯器為了節省空間,會將實作的member function使用同一份 也就是說,就算知道function address, 也沒辦法透過調整指標位置直接執行另一個object的function ※ 編輯: ofd168 (59.102.231.161 臺灣), 06/03/2020 00:19:09

06/03 00:25, 4年前 , 8F
你要的是 pointer to member function, 不過那也要你
06/03 00:25, 8F

06/03 00:26, 4年前 , 9F
先取得每個物件的位址才行
06/03 00:26, 9F

06/05 00:25, 4年前 , 10F
文章代碼(AID): #1Urak0uy (C_and_CPP)
文章代碼(AID): #1Urak0uy (C_and_CPP)