2016-11-03 4 views
1

I einen Zeiger auf ein Objekt ‚Eventhandler‘ haben, die eine Elementfunktion ‚HandleButtonEvents‘ hat:Geben eine Objekte Elementfunktion als Argument (Funktionszeiger)

I es so nennen:

eventHandler->HandleButtonEvents(); 

jetzt will ich einen Zeiger auf die Mitglieds Funktion übergeben ‚HandleButtonEvents()‘ der Klasse ‚Eventhandler‘ als Argument für einen anderen das Objekt ‚obj‘ wie in diesem Stackoverflow example:

ClassXY obj = ClassXY(eventHandler->HandleButtonEvents); 

Der Konstruktor wird wie folgt erklärt:

ClassXY(void(*f)(void)); 

Der Compiler sagt mir:

Fehler: ungültige Verwendung von nicht-statische Member-Funktion

Was mache ich falsch?

+0

Zeiger zu nicht statischen Elementfunktionen sind nicht identisch mit einem Zeiger auf eine Nichtmitgliedsfunktion. Ich empfehle Ihnen, in ['std :: function'] (http://en.cppreference.com/w/cpp/utility/functional/function) und [' std :: bind'] zu schauen (http: // en. cppreference.com/w/cpp/utility/functional/bind) statt. –

+0

Es sollte 'void (DecltypeEventHandler :: * f) (void)' sein. – skypjack

+0

@skypjack: kann das nicht verwenden, weil ich den Typ in dieser Klasse nicht einschließen kann (include-Schleife). Deshalb versuche ich den Funktionszeiger zu verwenden ... –

Antwort

1

Mit std::function und std::bind wie in meinem Kommentar vorgeschlagen macht es sehr einfach:

#include <iostream> 
#include <functional> 

class ClassXY 
{ 
    std::function<void()> function; 

public: 
    ClassXY(std::function<void()> f) 
     : function(f) 
    {} 

    void call() 
    { 
     function(); // Calls the function 
    } 
}; 

class Handler 
{ 
public: 
    void HandleButtonEvent() 
    { 
     std::cout << "Handler::HandleButtonEvent\n"; 
    } 
}; 

int main() 
{ 
    Handler* handler = new Handler; 

    ClassXY xy(std::bind(&Handler::HandleButtonEvent, handler)); 

    xy.call(); 
} 

See here for a live example.

Verwandte Themen