Zeiger auf Funktionen



  • Hallo zusammen,
    ich habe eine Fage zu Zeigern auf Funktionen und hoffe ihr könnt mir ein bisschen weiterhelfen:

    ich habe eine Klasse Test:

    class Test
    {
    private:
    bool (*CheckWord) (char*); //Zeiger auf FKT
    public:
    void setFunc(bool (*ptr) (char*)); //Setter Methode für *CheckWord
    };

    das sieht dann ungefähr so aus:
    void Test::setFunc(bool (*ptr) (char*))
    {
    CheckWord = ptr;
    }

    Jetzt hab ich in der MAIN Funktion meines Programms ein Objekt von
    der Klasse TEST erstellt (z.b. "testopject"). Außerdem die Funktion
    bool check (char *str); .

    Ein Aufruf von testobject->setFunc(check); funktioniert einwandfrei !
    Ein Aufruf von CheckWord() innerhalb der Klasse Test, ruft die Funktion check() in main auf !

    Sobald ich aber eine zweite Klasse "Foo" erstelle, und dort ein Objekt von "test", sowie die Funktion bool check (char *str) erstele und dort soetwas versuche:

    void foo::eineFunktionVonFoo(void)
    {
    this->testobjekt->setFunc(check);
    }

    beschwert sich der Compiler 😞
    Ich hoffe ich hab mich einigermaßen verständlich ausgedrückt, und ihr könnt mir weiter helfen.

    Hier noch die Meldung(gcc version 3.3.3):

    foo.cpp:204: error: no matching function for call to `Test::
    setFunc(<unknown type>)'
    Test.h:61: error: candidates are: bool Test::setFunc(bool
    ()(char))

    gruß,
    gripmaster



  • Hallo,

    zeig doch bitte mal, wei die Funktion check ausschaut.

    mfg
    v R

    PS: Bitte benutz Codetags, damit ist der Code besser lesbar



  • nur so:

    bool check(char *str)
    {
       std:out << str << std::endl;
    }
    


  • Sobald ich aber eine zweite Klasse "Foo" erstelle, und dort ein Objekt von "test", sowie die Funktion bool check (char *str) erstele und dort soetwas versuche:

    Das ich das richtig verstehe, du hast check als globale Funktion oder hast du
    check jetzt hier als Memberfunktion der Klasse Foo? Denn in diesem Falle kannst
    du normale Funktionszeiger nicht mehr anwenden, da jede Memberfunktion implizit
    den this-Zeiger mitfuehrt. Was du hier dann brauchst, ist ein Zeiger auf eine
    Memberfunktion:

    class Test {
    private:
    typedef bool (Foo::Func)(char*);
    Func* fptr;
    public:
    bool setFunc(Func* ptr) {
        fptr = ptr;
    }
    };
    

    mfg
    v R



  • genau! Wenn Check global ist, funktioniert es. Ist check eine Memberfunktion von "Foo" klappts nicht.

    Ich lasse jetzt erstmal "check" global, weil in "Test" "foo" überhaupt nicht bekannt ist.(und das soll auch nicht so sein!).
    Vielleicht fällt mir (oder dir/euch*g*) noch was anderes ein.

    Erstmal vielen Dank für deine Hilfe!
    gruß, gripmaster


Anmelden zum Antworten