С++ вызов переменной класса из статической функции обратного вызова
Вопрос такой: нужно получить доступ к объекту класса Ui::window в функции callback_function().
Есть информация, что можно в качестве аргумента функции callback_function передать ей (void*)this. Но я не знаю как это сделать. Такую конструкцию (void*)this он не принимает. Прошу помощи и выход из сложившейся ситуации.
При выполнении программы:
1) Вызывается функция send_file() класса A;
2) В этой функции вызывается системная функция curl_easy_setopt()
в которой последним аргументом идет указатель на функцию обратного вызова (callback_function)
3) Вызывается сама callback_function (В ней находятся некие данные , которые надо сразу отобразить в Ui::window при выполнении)
4) Никаких псевдонимов в приведенном коде типа: typedef void (*str)(char *c) нету. Только определение в классе A;
class A
{
static void callback_function(void* ptr, size_t size, size_t nmemb, void* stream);
private:
Ui::Window ui;
}
void A::send_file() { curl_easy_setopt(curl, CURLOPT_READFUNCTION, callback_function); } //curl_easy_setopt системная функция
void A::callback_function(void* ptr, size_t size, size_t nmemb, void* stream) // функция обратного вызова в стиле языка "С"
{
//Как в этом месте получить доступ к не статическому объекту Ui::window в класса A?
}
Ответы (1 шт):
class A
{
public:
static void callback_function(void* p,int a,char b)
{
A* self = static_cast<A*>(p);
//self->ui;
}
private:
Ui::Window ui;
};
int main(int argc, char *argv[])
{
A obj;
A::callback_function(&obj, 1, 'a');
return 0;
}
Дополнено, так как вопрос уточнен:
class A
{
public:
static void callback_function(void *ptr, size_t size, size_t nmemb, void *userdata)
{
A* self = static_cast<A*>(userdata);
//self->ui;
}
void send_file()
{
curl_easy_setopt(curl, CURLOPT_READFUNCTION, callback_function);
curl_easy_setopt(curl, CURLOPT_READDATA, (void *)this);
}
private:
Ui::Window ui;
...
};
int main(int argc, char *argv[])
{
A obj;
obj.send_file();
return 0;
}
Код не компилировал, но работать должно примерно так. Ключевой момент, что значение в userdata необходимо задавать с помощью:
curl_easy_setopt(curl, CURLOPT_READDATA, (void *)this);