Zeiger auf Memberfunktion



  • Hallo!

    Habe folgende Klassen:

    class C
    {
    private :
    
       void (*FunctionToCall)(char*) ;
    
    public :
    
       void SetFunctionToCall( void (*parFunc)(char*) )
       {
          FunctionToCall =  parFunc  ;
       }
    
       void Test()
       {
          FunctionToCall( "Hallo" );
       }
    
    };
    
    class B
    {
    protected :
    
    public :
    
       C *pC ;
    
       B()
       {
          pC = new C() ;
       }
    
       void SetFunctionToCall( void (*parFunc)(char*) )    
       {
          pC->SetFunctionToCall( parFunc ) ;
       }
    };
    
    class A : public B
    {
    
    public :
    
       void Function( char *ac )
       {
          int i = 0 ;    // Nur für breakpoint
       }
    
       A()
       {
          SetFunctionToCall( Function ) ;              // Zeile 65
       }
    
    };
    

    In main:

    A a ;
    
       a.pC->Test();
    

    Bekomme folgenden Fehler:

    [C++ Error] Unit1.cpp(65): E2342 Type mismatch in parameter 'parFunc' (wanted 'void (*)(char *)', got 'void')

    Was mache ich falsch?

    Ich weiss, ich könnte einen Pointer auf Objekt a übergeben und dann die Funktion aufrufen. Ich würde es aber lieber so machen, wenn es geht. Dass in main Test aufgerufen wird, ist eben nur ein Test. In Wirklichkeit ist C eine Klasse zur Kommunikation über MQS und eine empfangene Nachricht soll an eine übergeordnete Klasse weitergegeben werden.



  • Bitte lies Dir folgenden Thread durch, meine erste Antwort.

    Du versuchst eine Methode als Funktion zu übergeben.
    Alternativ musst Du wie dort beschrieben Methoden-Zeiger benutzen.

    http://www.c-plusplus.net/forum/viewtopic-var-t-is-165098.html



  • In dem Fall übergibst Du aber nur einen Zeiger auf eine Methode, aber nicht die Instanz, auf den Du die Methode anwenden kannst. Das musst Du
    zusätzlich übergeben oder Dir sonstwo besorgen. Eine Methode kannst Du schließlich nur in Abhängigkeit zu einer Instanz anwenden.

    Das heisst also, C muss auf jeden Fall Objekt a kennen.
    Na, dann werd ich halt doch den Pointer übergeben.

    Danke.



  • GV schrieb:

    In dem Fall übergibst Du aber nur einen Zeiger auf eine Methode, aber nicht die Instanz, auf den Du die Methode anwenden kannst. Das musst Du
    zusätzlich übergeben oder Dir sonstwo besorgen. Eine Methode kannst Du schließlich nur in Abhängigkeit zu einer Instanz anwenden.

    Das heisst also, C muss auf jeden Fall Objekt a kennen.
    Na, dann werd ich halt doch den Pointer übergeben.

    Danke.

    ???

    Die Frage ist wohl eher, was Du übergeben möchtest... den Hinweis die übergebene Funktion zu benutzen, den Hinweis die übergebene Methode auf eine beliebige Instanz zu benutzen oder eben etwas festgelegtes mit einer übergebenen Instanz zu machen.

    Das hängt ein wenig mit dem zusammen, was Du eigentlich programmieren möchtest 😉



  • C = Instanz C, nicht Sprache C/C++ ^^

    Nein, C muss A nicht kennen, aber C muss sich selber kennen.
    Da FunctionToCall nicht von A abhängt, muss es eine Funktion sein, also statisch sein, wenn es im Namensraum der Klasse existieren soll.

    Dann kannst Du FunctionToCall jederzeit rufen, wie Du eine beliebige statische Function rufen kannst.

    Du übergibst aber eine Methode, die ist von A abhängig, Du musst dich also entscheiden, was Du machen möchtest. Entweder einen Funktionszeiger, der auf eine statische Funktion von A zeigen kann oder ein Methodenzeiger, der aber nur mit einer beliebigen A-Instanz verwendet werden darf.

    Ich hoffe, das hilft Dir beim Verständnis weiter.

    //Edit: Vielleicht hilft es Dir beim Verständnis, wenn Du A::Function einfach mal statisch deklarierst.


Log in to reply