Funktionszeiger auf Funktion einer bestimmten Klassenfunktion



  • hi,

    ich habe eine Instanz von

    typedef void (*ProcessReport)(int,int);
    ProcessReport pProcessReport
    

    und möchte nun in diese einen Zeiger auf eine Memberfunktion speichern:

    class Cc
    {
    void func()
    {
    pProcessReport = func2;
    }
    
    void func2(int 1,int 2)
    {
    }
    
    };
    

    wie mach ich das am besten? 😕



  • Garnicht, denn ein Pointer-To-Member sieht anders aus:

    typedef void (Cc::*ProcessReport)(int,int);
    ProcessReport pProcessReport = &Cc::func;
    

    Logischerweise brauchst Du zum Aufrufen ein this-Objekt für die Methode:

    objOfCc.*pProcessReport(0,0);
    


  • das ist das Problem^^

    ich wöllte mich eben auf die Klasse nicht festlegen.

    Geht das auch irgendwie das ich ein und die selbe Definition des FunctionPointers für mehrere Klassen nehmen kann?



  • Nein, nicht schön (kannst dir natürlich was Ekliges mit Casts bauen).



  • Hallo,

    ich verzweifel hier gerade:

    #include <iostream>
    #include <conio.h>
    
    class Clazz{
    private:
        int i;
    public:
        Clazz(int i){this->i=i;}
        void mult(int i){
             std::cout << this->i * i << std::endl;
        }
        void add(int i){
             std::cout << this->i + i << std::endl;
        }
    };
    
    typedef void (Clazz::*Method)(int);
    
    int main(int argc, char** argv)
    {
        Method meth1 = &Clazz::mult;
        Method meth2 = &Clazz::add;
        Clazz c1 = Clazz(3);
        Clazz c2 = Clazz(5);
        c1.*meth1(2);
        c1.*meth2(2);
        c2.*meth1(5);
        c2.*meth2(5);
        _getch();
    }
    

    Warum funktioniert das denn hier nicht?

    must use .* or ->* to call pointer-to-member function in meth1 (...)' bzw. must use .* or ->* to call pointer-to-member function inmeth2 (...)'



  • *argh*

    (c1.*meth1)(2);
    


  • Also, ich hätte drei Lösungsansätze:

    Am elegantesten ist die erste Methode. Je nach Zweck können aber auch die anderen beiden vernünftig sein. Die zweite ist im TR1 enthalten und wird wahrscheinlich in C++0x standard sein. Bei der dritten bin ich mir nicht ganz sicher, aber sie ist auch recht portabel und vor allem schnell.
    (Variante 1 ist auch sehr schnell, aber wenn Vererbung nicht passt, dann zwei oder drei, wobei drei wesentlich schneller ist, zwei aber flexibler).

    MfG
    DDR-RAM



  • danke danke danke^^

    ich habs einfach (naja nicht ganz ;)) mit ner zwischengeschalteten Funktion gemacht.


Log in to reply