1

以下のプロトタイプを使用して、コールバック関数を介してデータを返すcurlライブラリを使用しています

size_t write_data(void * data, size_t size, size_t nmemb, void * userpointer);

クラスでこのプロトタイプに適合する関数を宣言すると、

//file Dialog.h
class Dialog : public QDialog
{
    private:
    int new_data_callback(void * newdata, size_t size, size_t nmemb, QByteArray * buffer); 
}

Dialog.cppで使用しようとすると

curl_easy_setopt(curl_handle,CURLOPT_WRITEFUNCTIION, new_data_callback);

エラーが発生する

Invaid use of member (did you forget the '&'?)

関数宣言に追加staticすると、コンパイルされます。

static int new_data_callback(void * newdata, size_t size, size_t nmemb, QByteArray * buffer); //ok

質問

この場合、なぜ静的が必要なのですか?

PS: Q で始まるクラス、たとえば QDialog はQTの一部であり、質問には影響しません。

4

2 に答える 2

3

非静的メソッドはインスタンスなしでは呼び出すことができないためです。はコールバックであるためnew_data_callback、インスタンスをアタッチする唯一の方法はパラメーターを使用することです。作成するとstatic、インスタンスの制限が解除されます。

于 2012-06-29T17:54:10.293 に答える
1

これは、関数の呼び出し方法が原因です。非静的クラス関数を呼び出すには、追加情報が必要です。つまり、thisポインターです。このインスタンスに渡すnew_data_callbackと、特定の情報は提供されません。curl_easy_setoptしたがって、curl には関数を呼び出すための十分な情報がありません。

クラス関数が静的に定義されている場合、定義により、クラスの非静的メンバーにアクセスできません。したがって、上記の追加のインスタンス情報は必要なく、に渡すことができます。set_easy_setopt

于 2012-06-29T18:02:58.180 に答える