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_callbackcurl_easy_setopt此实例时,未提供特定信息。因此,curl 没有足够的信息来调用该函数。

如果类函数定义为静态,则根据定义,它不能访问类的非静态成员。因此它不需要上面的附加实例信息,可以传递给set_easy_setopt

于 2012-06-29T18:02:58.180 回答