(C++) array mit Pointern auf Funktionen



  • irgendwie stell ich mich mal wieder zu doof an *g*

    also, ich hab da einen Haufen Funktionen:

    void hideStep1(void);
    void hideStep1(void);
    void hideStep1(void);
    void hideStep1(void);
    void hideStep1(void);
    usw.

    und auf die möchte ich über ein Array zugreifen

    array_mit_pFunktion[0]();
    array_mit_pFunktion[1]();
    array_mit_pFunktion[2]();

    usw.

    aber irgendwie krieg ich die Dinger da nicht rein 😞
    weiss auch nicht. Gehen tut das irgendwie, gemacht habe ich sowas schon mal, aber ich kann den Code auch nicht finden.

    Hat einer 'n Zweizeiler zur Hand?

    Dange
    Ulli



  • void Func0(void)
    {
    }
    void Func1(void)
    {
    }
    void Func2(void)
    {
    }
    void Func3(void)
    {
    }
    void Func4(void)
    {
    }
    
    typedef void (*LP_FUNC)(void);
    LP_FUNC funcArr[]={Func0,Func1,Func2,Func3,Func4};
    
    void exec()
    {
        funcArr[0]();
        funcArr[1]();
        funcArr[2]();
        funcArr[3]();
        //....
    }
    


  • dange 🙂



  • hmmmm ... so hatte ich das eigentlich auch im Kopf.
    nur in diesem Fall funzt das so nicht.

    Die Funktionen gehören zu einer einer Klasse

    typedef void (*lp_AUF_VFUNKT)(void);
    
    class KWizz {
     public:
       KWizz(int language);
       ~KWizz();
    (...)
     private:
       lp_AUF_VFUNKT lpHideFunc[10];   
       void showStep0(void);
       void hideStep0(void);
       void showStep1(void);
       void hideStep1(void);
       void showStep2(void);
       void hideStep2(void);
    };
    
    *************************
    KWizz::KWizz(int language)
    {
        (...)
        lpHideFunc[0]=hideStep0;
        lpHideFunc[1]=hideStep1;
        (...)
    
    }
    

    so nimmt der Kompiler das jedenfalls nicht.



  • Dann sag halt im typedef, dass sie zur Klasse gehören

    typedef void (*KWizz::lp_AUF_VFUNKT)(void);
    


  • das funzt alles von hinten bis vorne nich!

    ausserhalb einer Klasse -> no Prob

    in einer Klasse:
    entweder der Compiler meckert
    oder die Funktion wird nicht ausgeführt



  • so!

    denn eben mit Spagetticode!
    eine lange case-Struktur geht auch.

    Hat sich also erledigt,
    wobei, wurmt ich ja echt.
    Vielleicht hat ja mal einer Lust was lauffähiges zu basteln



  • Darf man hier net mal ein bissel nachdenken mehr von den Postern erwarten??

    class KWizz
    {
     public:
       KWizz(int language);
       ~KWizz();
     private:
       typedef void (*KWizz::lp_AUF_VFUNKT)(void);
       lp_AUF_VFUNKT lpHideFunc[10];   
       void showStep0(void);
       void hideStep0(void);
       void showStep1(void);
       void hideStep1(void);
       void showStep2(void);
       void hideStep2(void);
    };
    

    Funktioniert doch OHNE Probleme!



  • Nachtrag:

    void showStep0(void);
    void hideStep0(void);
    void showStep1(void);
    void hideStep1(void);
    void showStep2(void);
    void hideStep2(void);
    

    Sowas macht man eh net!!

    Besser:

    void showStep(int step);
    void hideStep(int step);
    


  • Original erstellt von RenéG:
    **Darf man hier net mal ein bissel nachdenken mehr von den Postern erwarten??

    class KWizz
    {
     public:
       KWizz(int language);
       ~KWizz();
     private:
       typedef void (*KWizz::lp_AUF_VFUNKT)(void);
       lp_AUF_VFUNKT lpHideFunc[10];   
       void showStep0(void);
       void hideStep0(void);
       void showStep1(void);
       void hideStep1(void);
       void showStep2(void);
       void hideStep2(void);
    };
    

    Funktioniert doch OHNE Probleme!**

    ja, soweit war ich auch... (sorry)
    aber weiter!



  • Original erstellt von RenéG:
    **Nachtrag:

    void showStep0(void);
    void hideStep0(void);
    void showStep1(void);
    void hideStep1(void);
    void showStep2(void);
    void hideStep2(void);
    

    Sowas macht man eh net!!

    Besser:

    void showStep(int step);
    void hideStep(int step);
    

    **

    Die "Besser-Lösung" hätte Spagetticode zur Folge:

    void showStep(int step)
    {
       switch(step)
           {
            case 1:
              .....
                break;
            case 2:
              ....
                break;
            usw...
           }  
    }
    

    da jeder Step ganz unterschiedliche Objekte nach vorn holt bzw. versteckt

    die "Steps" folgen auch nicht in glatter Reihenfolge, sondern die Reihenfolge ergibt sich erst zur Laufzeit aus den eingegebenen Daten.



  • Wie weiter?
    Du rufst die Funktionen einfach auf. 🙂

    Du musst sie natürlich auf ein Objekt aufrufen. Das geht mit dem .* oder dem ->* Operator:

    (this->*lpHideFunc[i])();
    

    btw:
    Das gehört ja wohl eindeutig nach C++ und nicht nach winapi. 🙂


Anmelden zum Antworten