2011-10-20 6 views
2

をC++の関数ポインタを渡す可能性の重複:
How can I pass a C++ member function to a C API as a parameterは、C関数に

こんにちは、私は次のようにコールバックを期待するC関数を持つクラスを持っている: 無効fun_c(ボイド*( * ptr)(void *))。

class ClassA{ 
    method1(){ 
    func(ClassA::func); 
    } 
    void * func(void * arg){ 
    } 
} 

は誰もが、この作品がすることができます。

今私は、誰もがこれを行う方法を教えすることができ、C++、C関数への方法を送りたいです。

+0

'method1()'には戻り値の型はありませんが、コンストラクタ/デストラクタではありません。 'method1'の' func'は 'ClassA :: func'と同じになります。関数を渡すと、自分自身へのポインタが変です。 'func'のシグネチャは実際には関数ポインタを取るわけではなく、' void * 'をとります。これは合法ではありません。 – Flexo

答えて

0

インスタンス関数を使ってこれを行うことはできません。なぜなら、Cコードにはインスタンスが用意されていないか、あるいは何をどうするのかという知識さえもないからです。代わりに静的関数を使用する必要があります。

0

基本的には通常、このような場合は、あなたは、コールバック関数が戻ってあなたがそれを与えるいくつかのデータ・ポインタであなたを呼び出すこと

void MyCallBack(void* arg) 
{ 
    ClassA * p = static_cast<ClassA*> (arg); 
    //Invoke any member functions of p as needed 
    p->HandleCallBack(); 
} 

これは仮定に基づいている宣言することができます。そして、あなたがコールバックを設定するときにこれを渡します。

+1

技術的には、実際には 'extern" C "'が必要ですが、実際にはC++の実装では、C関数と同じようにフリーのC++関数に対して同じ呼び出し規約を使用します。残念ながら、この場合、C APIはひどく設計されているようです。なぜなら、 'fun_c'はデータポインター、単に関数ポインターを取っていないからです。だから質問者は不運です。 –

+0

私の間違い申し訳ありません:クラスClassA { method1(){ func(ClassA :: func); } void * func(void * arg){ } } – maheshgupta024