質問するログイン新規登録

回答編集履歴

1

追記

2021/12/24 11:20

投稿

episteme
episteme

スコア16612

answer CHANGED
@@ -44,4 +44,67 @@
44
44
 
45
45
  mng.ExecFunc(); // 全部呼んじゃうぞ!
46
46
  }
47
+ ```
48
+
49
+ [追記] ぢゃ...コレじゃダメっすか?
50
+
51
+ ```C++
52
+ #include <iostream>
53
+ #include <vector>
54
+
55
+ class appUpdate;
56
+
57
+ struct ParamClass {
58
+ // 関数ポインタ
59
+ typedef void (appUpdate::* LPFN_FUNC)(void);
60
+ LPFN_FUNC m_pFunc;
61
+ // レシーバ
62
+ appUpdate* m_pReceiver;
63
+ ParamClass(appUpdate* recv, LPFN_FUNC func) : m_pReceiver(recv), m_pFunc(func) {}
64
+ void execute();
65
+ };
66
+
67
+ class appManager {
68
+ public:
69
+ appManager() {}
70
+ ~appManager() {}
71
+
72
+ private:
73
+ std::vector<ParamClass> m_ParamList;
74
+
75
+ public:
76
+ // m_pFuncに登録された関数をコールする関数
77
+ void ExecFunc(void) {
78
+ for ( auto& param : m_ParamList ) param.execute();
79
+ }
80
+
81
+ // 関数の登録処理
82
+ void EntryFunc(ParamClass param) {
83
+ m_ParamList.emplace_back(param);
84
+ }
85
+ };
86
+
87
+ class appUpdate {
88
+ public:
89
+ appUpdate() {}
90
+ ~appUpdate() {}
91
+
92
+ public:
93
+ // appManagerのParamClassに登録する関数
94
+ void UpdateRender() { std::cout << "appUpdate::UpdateRender()\n"; }
95
+ };
96
+
97
+ void ParamClass::execute() { (m_pReceiver->*m_pFunc)(); }
98
+
99
+ int main() {
100
+ appManager mngr;
101
+
102
+ appUpdate app1;
103
+ appUpdate app2;
104
+
105
+ mngr.EntryFunc(ParamClass(&app1, &appUpdate::UpdateRender));
106
+ mngr.EntryFunc(ParamClass(&app2, &appUpdate::UpdateRender));
107
+
108
+ mngr.ExecFunc();
109
+ }
47
110
  ```