2012-06-29 91 views
1

我使用curl library它通過一個回調函數下面爲什麼靜態需要在這裏

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的一部分,並且不影響該問題。

+1

因爲非靜態成員函數對'this'有一個隱式參數;即你的有效簽名看起來像'int new_data_callback(Dialog * this,void * newdata,size_t size,size_t nmemb,QByteArray * buffer);',這顯然不是'curl_easy_setopt'想要的簽名。 – ildjarn

回答

3

因爲在沒有實例的情況下無法調用非靜態方法。由於new_data_callback是回調函數,因此將實例附加到它的唯一方法是通過參數。使它static刪除實例限制。

1

這是因爲如何調用函數。非靜態類函數需要調用附加信息。即這個指針。當您將new_data_callback傳遞給curl_easy_setopt時,不會提供此實例特定的信息。因此,curl沒有足夠的信息來調用該函數。

如果一個類的函數被定義爲靜態的,那麼按照定義,它不能訪問一個類的非靜態成員。因此它不需要上面的附加實例信息,並且可以傳遞給set_easy_setopt