2016-11-30 5 views
0

私は、このサードパーティの型定義を持っている:サードパーティコードのメンバ関数へのポインタを正しく渡すにはどうすればよいですか?

サードパーティのライブラリ内の関数で使用されている
typedef void (*NexTouchEventCb)(void *ptr); 

:私は、単一の.cppファイルを持っている場合は

void NexTouch::attachPop(NexTouchEventCb pop, void *ptr) 

その後、私は正常に呼び出すことができます任意のコンパイラエラーなしattachPop

NexButton b0 = NexButton(0, 1, "b0"); 

void b0PopCallback(void *ptr) 
{ 
    // do something here 
} 

b0.attachPop(b0PopCallback, &b0); 

しかし、私はOOPを行うので、私は自分のヘッダファイルとクラスファイルを持っている:

MyNextion.h

class MyNextion { 
    public: 
     void init(); 
     void b0PopCallback(void *ptr); 
    private: 
     NexButton *b0; 
} 

MyNextion.cpp

#include "MyNextion.h" 

void MyNextion::init() { 
    b0 = new NexButton(0, 1, "b0"); 
    b0->attachPop(/* what should I put here? */); 
} 

void MyNextion::b0PopCallback(void *ptr) { 
    // do something here 
} 

私もthisthisthis 1のようないくつかの同様の質問を通り抜けました。しかし、私はそれを取得しません。

このコードは、AVRマイクロコントローラであるArduino用にコンパイルされています。特別なC++構文は利用できないかもしれません。

私はb0->attachPopとどのように連絡すればいいですか、どうして私はそのように呼びますか?私はここで見つけることができるサードパーティのライブラリを、変更することはできませんよ

ご注意:https://github.com/itead/ITEADLIB_Arduino_Nextion

+0

:幸いなことに、あなたのAPIを使用すると、あなたが呼び出したいオブジェクトを置くことができ、追加のvoid*ポインタを渡します。また、私はAVRマイクロコントローラであるArduino用にコンパイルしているというメモを追加しました。 – papaiatis

+0

可能性のある複製には、静的メンバー機能の実行方法は記載されていません。 – papaiatis

+0

他にも多数の重複がありますが、質問には1つだけフラグを付けることができます。 – MrEricSir

答えて

2

あなたが唯一このように、静的メンバ関数(または非メンバ関数)を使用することができます。私もその質問に見てみましょう

class MyNextion { 
public: 
    void init(); 
    void b0PopCallback(); 
private: 
    static void b0PopStaticCallback(void *ptr); 
    NexButton *b0; 
}; 

void MyNextion::b0PopStaticCallback(void *ptr) 
{ 
    static_cast<MyNextion*>(ptr)->b0PopCallback(); 
} 

void MyNextion::init() 
{ 
    b0 = new NexButton(0, 1, "b0"); 
    b0->attachPop(b0PopStaticCallback, this); 
} 
+0

ありがとうございました!私はこれを決して想像していないでしょう。 – papaiatis

関連する問題