"Anyone can make the simple complicated. Creativity is making the complicated simple."
(Charles Minguns)
Hallo zusammen!
Es gibt in meinem immer größer werdenden Code einige Stellen, wo die immergleichen Methoden verschiedener Klassen (sei es Release() oder Adapt() oder Update() usw..) aufgerufen werden müssen.
Darum hab ich mir gedacht, eine Klasse zum Verwalten von "Funktionsgruppen" (=Arrays aus Funktionspointern) zu basteln. Diese Klasse besitzt dann nur noch eine Methode names "RunFunctionGroup".
In einen Container (eine Map aus Vektoren dieses Funktionsrumpfes) schmeiss ich dann die Methoden meiner Klassen rein. Alles regelt sich von selbst
Ich dachte da an sowas:
|
C-/C++-Quelltext
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
using namespace std;
// Map aus Vektoren aus Funktionspointer
map<char*, vector< HRESULT(*)() > > m_CallThisFunc;
// ...
// Zur Gruppe Hinzufügen
void AddFuncToGroup(char* cGroup, HRESULT (* pFunc)(void)) {
// Adresse zur Funktionsgruppe hinzufügen!
m_CallThisFunc[cGroup].push_back( pFunc );
}
// ...
// Funktionsgruppe ausführen!
void ExecuteFunctionPool(char* cPoolName) {
HRESULT (* pFunc)(void);
for( size_t i=0; i< m_CallThisFunc[cPoolName].size(); i++) {
// Funktionspointer übernehmen!
pFunc = m_CallThisFunc[cPoolName][i];
// Ausführen, falls valide Funktion
if( nullptr != pFunc) {
// Ausführen!
pFunc();
}
}
}
|
Nun meldet sich ein altbekannter Feind von mir: Zeiger auf Methoden/usw. einer Instanz.
Und zwar hab ich in meiner Klasse ein LPD3DXFONT-Objekt, welches die Methoden OnLostDevice() und UnResetDevice() verwendet:
|
C-/C++-Quelltext
|
1
2
3
4
5
6
7
|
class CText {
// In class CText oder so
LPD3DXFONT m_font;
m_font->OnLostDevice(); // Parameter: void
m_font->OnResetDevice(); // auch void
}
|
Wie füge ich nun die Adressen dieser Methoden dieses Objekts in einer Instanz der Klasse CText zum Funktionskontainer hinzu??
|
C-/C++-Quelltext
|
1
2
3
4
5
6
7
8
|
// Das geht in die Hose! :(
pTest = reinterpret_cast<HRESULT(*)()> (Text.m_font->OnLostDevice());
// Funktionspointer zur Gruppe hinzufügen, später ausführe
Manager.AddFuncToGroup( "Sprites", pTest );
// Später dann:
Manager.ExecuteFunctionPool("Sprites");
|
Ich weiß, dass die Antwort sicher einfach ist. Zeiger und Funktionszeiger, Dereferenzierungen und das Zeugs zählen leider noch nicht zu meinen Stärken.
Ich hab mal alles ausführlich geschrieben damit man es vielleicht in die FAQ setzen kann
Danke für jegliche Hilfe!
Mit freundlichen Grüßen
Johannes Schneider