Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/159.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么这里需要静电_C++_Static_Static Methods - Fatal编程技术网

C++ 为什么这里需要静电

C++ 为什么这里需要静电,c++,static,static-methods,C++,Static,Static Methods,我正在使用它,它通过一个回调函数将数据返回给我,原型如下 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 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); 
}
如果我尝试在我的对话框.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 eg QDialog开头的类是问题的一部分,不会影响问题。

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

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

这是因为函数是如何被调用的。非静态类函数需要调用其他信息。也就是这个指针的指针。当您将
new\u data\u callback
传递到
curl\u easy\u setopt
时,不提供此实例特定信息。因此,curl没有足够的信息来调用函数


如果类函数是静态定义的,则根据定义,它不能访问类的非静态成员。因此,它不需要如上所述的附加实例信息,可以传递给
set\u easy\u setopt

,这是因为函数是如何被调用的。非静态类函数需要调用其他信息。也就是这个指针的指针。当您将
new\u data\u callback
传递到
curl\u easy\u setopt
时,不提供此实例特定信息。因此,curl没有足够的信息来调用函数


如果类函数是静态定义的,则根据定义,它不能访问类的非静态成员。因此,它不需要如上所述的附加实例信息,并且可以传递给
set\u easy\u setopt

,因为非静态成员函数具有
的隐式参数;i、 e.您的有效签名看起来像
int new_data_callback(Dialog*this,void*newdata,size\t size,size\t nmemb,QByteArray*buffer)
,这显然不是
curl\u easy\u setopt
想要的签名;i、 e.您的有效签名看起来像
int new_data_callback(Dialog*this,void*newdata,size\t size,size\t nmemb,QByteArray*buffer)
,这显然不是
curl\u easy\u setopt
想要的签名。