2016-08-06 7 views
-1

Mein Problem ist ungültig, Funktionszeiger auf Elementfunktion umwandeln. Alles ist in Ordnung, wenn die coap_handler Elementfunktion statisch ist. Die Instanz von CoapClient kann nicht statisch und global sein. Ich möchte statisch von coap_handler() entfernen. Wie man es macht? DankUngültiger konvertierender Funktionszeiger zur Elementfunktion

class CoapClient{ 
... 
void connect(){  
mg_connect(&mgr, address.c_str(), coap_handler); 
} 

static void coap_handler(struct mg_connection *nc, int ev, void *p) { 
... 

} 
}; 

////// Signatur mg_connect function

struct mg_connection *mg_connect(struct mg_mgr *mgr, const char *address, 
           mg_event_handler_t callback); 

////// Unterschrift des mg_event_handler_t

Callback-Funktion (Event-Handler) Prototyp. Muss vom Benutzer definiert werden. Mongoose ruft den Event-Handler auf und übergibt die unten definierten Ereignisse.

typedef void (*mg_event_handler_t)(struct mg_connection *, int ev, void *); 
+0

Sie können nicht? Mitgliedsfunktionszeiger müssen über eine Instanz verfügen, um sie actully aufzurufen. –

+0

Die connect-Methode wird in einem Konstruktor der CoapClient-Klasse aufgerufen. –

+0

Veröffentlichen Sie ein [MCVE], das Ihr Problem tatsächlich zeigt. –

Antwort

0

Sie können einen Mitgliedsfunktionszeiger nicht in einen normalen Funktionszeiger konvertieren, Sie benötigen ein "Trampolin".

Unter der Annahme, dass jeder CoapClient besitzt es eigene mg_mgr ist, können Sie es mit einem Zeiger auf die Klasseninstanz während der Bauphase zur Verfügung stellen kann:

struct CoapClient { 
    mg_mgr mgr_; // _ suffix to annotate member variable 
    std::string address_; 

    CoapClient() { 
     mg_mgr_init(&mgr_, self); // `self` is mg_mgr's userData. 
    } 

    // We need a regular/static function to pass to the handler, 
    // this is the trampoline: 
    static connect_handler(mg_connection* conn, int ev, void *userData) { 
     auto instance = static_cast<CoapClient>(userData); 
     userData->onConnect(conn, ev); 
    } 

    void onConnect(mg_connection* conn, int ev); 

    void connect() { 
     mg_connect(&mgr_, address_.c_str(), connect_handler); 
    } 
} 

Oder wir könnten eine Lambda verwenden, und es lässt sich auf:

struct CoapClient { 
    mg_mgr mgr_; // _ suffix to annotate member variable 
    std::string address_; 

    CoapClient() { 
     mg_mgr_init(&mgr_, self); // `self` is mg_mgr's userData. 
    } 

    void onConnect(mg_connection* conn, int ev); 

    void connect() { 
     mg_connect(&mgr_, address_.c_str(), [](mg_connection* conn, int ev, void *ud) { 
      static_cast<CoapClient*>(ud)->onConnect(conn, ev); 
     }); 
    } 
}