2016-08-06 9 views
-1

私の問題は、関数ポインタからメンバ関数への変換が無効です。 coap_handlerメンバ関数が静的であれば、問題はありません。 CoapClientのインスタンスは、静的でグローバルにすることはできません。私はcoap_handler()から静的を削除したい。それを作る方法? mg_event_handler_tメンバー関数への変換関数ポインタの無効化

コールバック関数(イベントハンドラ)のプロトタイプのおかげ

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

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

} 
}; 

//////署名mg_connect function

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

//////署名。ユーザーが定義する必要があります。 Mongooseは、以下で定義されたイベントを渡してイベントハンドラを呼び出します。

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

できませんか?メンバ関数ポインタは、それらをactullyと呼ぶインスタンスを持つ必要があります。 –

+0

connectメソッドは、CoapClientクラスのコンストラクタで呼び出されます。 –

+0

あなたの問題を実際に示す[MCVE]を投稿してください。 –

答えて

0

メンバ関数ポインタを正規関数ポインタに変換することはできません。「トランポリン」が必要です。

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); 
    } 
} 

それとも私たちはラムダを使用し、それを煮詰めることができます::

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); 
     }); 
    } 
} 

CoapClientが、それはあなたが建設中にクラスのインスタンスへのポインタでそれを提供することができ、自分のmg_mgrだ所有していると仮定すると、

関連する問題