funktionsverweis in struktur ?
-
geht das ?
also
struct funktionsliste { BOOL m_Flag; int *funktion(CString*); }fkl[] = { FALSE, funktion1, FALSE, funktion2, };
so oder so ungefaehr - die funktionen sind in der klasse bekannt
mein ziel ist es sowas zu vermeiden
if(m_flag1 == TRUE) function1; if(m_flag2 == TRUE) funktion2; //usw
da waehre es praktisch so machen zu koennen
for(int i=0; i<functionsanzahl; i++) { if(fkl[i].m_Flag == TRUE) if(!fkl.[i].funktion(&string)) break; }
jemand ne idee ? geht das ueberhaupt ?
-
struct funktionsliste { BOOL m_Flag; int (*funktion)(CString*); }fkl[] = { FALSE, funktion1, FALSE, funktion2, };
Klammern müssten anders gesetzt werden.
-
ich hab meine schwierigkeiten mit dem argument - CString *csString - csString ist dieser klasse immer nur waehrend der laufzeit bekannt {es wird beim aufruf der klasse erst uebergeben}
struct funktionsliste { BOOL m_Flag; int (*funktion)(CString*); }fkl[] = { FALSE, (&COwn::Funktion)(??), };
-
ich hab da was - compiliert, obs funktioniert weiss ich noch nicht
class Klasse { BOOL m_Flag1; BOOL m_Flag2; afx_msg int Funktion1(CString *csString); afx_msg int Funktion2(CString *csString); struct funktionsliste { BOOL m_Flag; int (CManipulate::*funktion)(CString*); }; };
// cpp datei - global Klasse::funktionsliste fkl[] = { FALSE, &(Klasse::Funktion1), FALSE, &(Klasse::Funktion2), };
-
nu haperts am aufruf #grr
int Klasse::Run(CString *csString, int iNumber) { for(int i=0; i<iCountfunctions; i++) fkl[i].funktion(csString); return iRet; }
funzt nicht - er erlaubt das argument nicht
-
Das ist ja auch eine nicht statische Funktion der Klasse. Geht es nun um normale Funktionen oder Member-Funktionen einer Klasse? Bei dem einen ist ja noch ein this Zeiger nötig!
-
die funktionen sind public bestandteile der klasse, der name funktion muesste eigentlich methode lauten - waehre nett wenn du mir das mit den this zeiger noch erklaeren koenntest {=
*.h
class CKlasse { BOOL m_FlagMethode1; BOOL m_FlagMethode2; afx_msg int Methode1(CString *, UINT); afx_msg int Methode2(CString *, UINT); struct MethodenListe { BOOL m_Flag; int (CKlasse::*Methode)(CString *, UINT); } afx_msg int Run(CString *csString, UINT iNumber); }
*.cpp
CKlasse::Methodenliste ml[] = { FALSE, &(CKlasse::Methode1), FALSE, &(CKlasse::Methode2), } // Beeinflussung der flags von aussen durch // ml[i].m_Flag = TRUE/FALSE; int CKlasse::Run(CString *csString, UINT iNumber) { for(int i=0; i<2; i++) if(ml[i].mFlag == TRUE) if(!(ml[i].Methode)(csString, iNumber)); // argumente nicht zulaessig /= return -1; return 0; }
-
hab jetzt mit hilfe der MSDN das zusammen gefummelt
int CKlasse::Run(CString *csString, int iNumber) { for(int i=0; i<iCountfunctions; i++) if(fkl[i].m_Flag == TRUE( if(!((this->*fkl[i].funktion)(csString, iNumber))) return -1; return 0; }
compiliert nu fehlerfrei - obs funktioniert werd ich spaeter erst erfahren