我正在使用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的一部分,不会影响问题。
答案 0 :(得分:3)
因为没有实例就无法调用非静态方法。由于new_data_callback
是一个回调,因此将实例附加到它的唯一方法是通过参数。使其static
删除实例限制。
答案 1 :(得分:1)
这是因为调用函数的方式。非静态类函数需要调用其他信息。即 this 指针。当您将new_data_callback
传递给curl_easy_setopt
时,不会提供此实例特定信息。因此,curl没有足够的信息来调用函数。
如果定义了类函数静态,则根据定义,它不能访问类的非静态成员。因此,它不需要上面的其他实例信息,可以传递给set_easy_setopt