Funktion die andere Funktion über Zeiger aufruft innerhalb einer Klasse



  • Hallo, ich hoffeine Thread Beschreibung zum Thema passt.

    Bei obj.call( obj.print ); bekomme ich:

    [C++ Fehler] Unit1.cpp(25): E2034 Konvertierung von 'int (* (_closure )())()' nach 'int (*)()' nicht möglich
    [C++ Fehler] Unit1.cpp(25): E2342 Keine Übereinstimmung des Typs beim Parameter 'func' ('int (*)()' erwartet, 'void' erhalten)
    [C++ Warnung] Unit1.cpp(43): W8070 Funktion sollte einen Wert zurückgeben
    

    Wie macht man das richtig?

    #include <iostream>
    #include <vector>
    using namespace std;
    
    class win
    {
    
    public:
            int print();
            int call (  int (*func)() );
    
    };
    
    int print_2 ();
    
    int main()
    {
    win obj;
    
            obj.call( &print_2 ); // Funktioniert
            obj.call( obj.print );
    
    system("PAUSE");
    }
    //---------------------------------------------------------------------------
    
    int win :: print()
    {
            cout<<"ok aus class";
            return 0;
    }
    
    int win ::  call (  int (*func)() )
    {
            func();
    }
    
    int print_2()
    {
            cout<<"ok";
            return 0;
    }
    


  • Nichtstatische Memberfunktionen operieren auf einem Objekt, sie haben einen unsichtbaren "this" Parameter, also würde das "print()" erweitert zu "print(win* this)". Du könntest die Funktion z.B. statisch machen. (Und dann einen solchen Pointer "manuell" mitgeben, falls gewollt.)
    Oder du liest: http://www.parashift.com/c++-faq-lite/pointers-to-members.html



  • Das, was du willst ist ein Methodenzeiger...
    call müsste wie folgt deklariert werden:

    int call (  int (win::*func)() );
    

    Beim Aufruf muss es dann auch

    obj.call(&win::print);
    

    heißen.


Anmelden zum Antworten