为什么这里需要静态

时间:2012-06-29 17:50:15

标签: c++ static static-methods

我正在使用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的一部分,不会影响问题。

2 个答案:

答案 0 :(得分:3)

因为没有实例就无法调用非静态方法。由于new_data_callback是一个回调,因此将实例附加到它的唯一方法是通过参数。使其static删除实例限制。

答案 1 :(得分:1)

这是因为调用函数的方式。非静态类函数需要调用其他信息。即 this 指针。当您将new_data_callback传递给curl_easy_setopt时,不会提供此实例特定信息。因此,curl没有足够的信息来调用函数。

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