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 ?


  • Mod

    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


  • Mod

    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


Log in to reply