1

私は、コールバック関数を定義する必要があるsdkを使用しています。問題は、「サンプル」コードがグローバル関数と非常に手続き的なアプローチで出荷されていることです。それを構造に組み込むために、クラスを作成していました。しかし、引数を定義して宣言するときに、引数の構文を正しく取得できませんでした O_o

だからここに私の実例があります:

私のcode.hで:

void   (*MessageHandler)(int msgType, char* msg){printf("\n%s\n", msg);}

私のcode.cppを呼び出すと、これはうまくいきます

void (*opFunc)(int msgType, char* msg) =  MessageHandler;

しかし、私は自分の cpp で定義を行いたいのですが、構文が見つかりませんでした。通常は次のようにする必要があります。

void (*Code::MessageHandler)(int msgType, char* msg){
    printf("\n%s\n", msg);
}

しかし、これは機能せず、修正方法のヒントが見つかりませんでした。ヒントになるといいですね!

4

2 に答える 2

1

これは関数なので、他の関数と同じように定義します。

void Code::MessageHandler(int msgType, char* msg){
    printf("\n%s\n", msg);
}

その名前Code::MessageHandlerは、実際には正しい型の関数ポインターです。が の場合、これは期待どおりに機能します。の場合Codeは、バインドされていない参照を取得するために宣言する必要があります。namespaceclassstatic

また、typedefソース コードを読みやすくするために使用することも検討してください。

于 2013-05-10T17:16:59.210 に答える
1

Codeクラス内で関数ポインタの関数を定義しようとしているように見えますか? 関数 (静的メンバーまたはグローバル関数のいずれか) を作成し、その関数の名前をポインターとして使用するだけです。

void Code::MessageHandler( int msgType, char* msg ){
  printf( "\n%s\n", msg );
}

// Create a function pointer called fn to point at a static function
void (*fn)( int, char * ) = &Code::MessageHandler;

MessageHandler が静的関数でない場合、これは機能しないことに注意してください。それ以外の場合は、関数ポインターとは大きく異なるメンバー関数ポインターを扱うことになります。

Code::MessageHandlerそれ自体を関数ポインターにしたい場合は、構築時にグローバル関数に割り当てます。

于 2013-05-10T17:14:54.303 に答える