我有一个看起来像下面的结构
struct dc_callback
{
int
my_configure_event(
GtkWidget *widget,
GdkEventConfigure *event,
struct LoadData *myData)
{
...others
return TRUE;
}
//Parametrized Constructor
int
my_draw(
GtkWidget *widget,
cairo_t *cr,
struct LoadData *myData)
{
...others
return TRUE;
}
};
它有两个拟在第n次从g_signal_connect
调用的参数化成员函数。
main(){
int i;
dc_callback dc_callback_instance[nth];
for(i=0;i<nth;i++){
g_signal_connect(widget_list[i],"draw",G_CALLBACK(dc_callback_instance[i].my_draw),myData);
g_signal_connect(widget_list[i],"configure-event",G_CALLBACK(dc_callback_instance[i].my_configure_event),myData);
}
}
但是,在编译期间,我收到有关成员函数int dc_callback::my_draw(args)
无效使用的错误。它要求我添加()
,但无法完成,因为G_CALLBACK接受不带附加参数的函数名。
我该如何完成?
G_CALLBACK
需要一个(非成员)函数指针,并且您没有使用正确的语法来传递函数指针。但是,存在一个更大的问题:函数指针和成员函数指针是C ++中的不同概念。您不能将成员函数指针传递给需要标准函数指针的接口。那么,如何将回调的调用与您的dc_callback
实例相关联?
[通常,在使用C风格的API时,您必须为回调提供一个免费功能,该回调将您的实例作为void*
参数。然后在回调中,您可以将void*
强制转换回原始类型。就您而言,这可能类似于:
struct CallbackData {
dc_callback& dc_callback_inst;
Foo otherData; // whatever else you need to capture here
};
void my_draw_cb(void* data) { // g_signal_connect might pass more params to cb in addition to data
CallbackData& cbData = *(CallbackData*)data;
cbData->dc_callback_inst.my_draw(cbData->otherData);
}
// ...
for(i=0;i<nth;i++){
CallbackData cbData{dc_callback_instance[i], myData};
g_signal_connect(widget_list[i],"draw",G_CALLBACK(&my_draw_cb),cbData);
// ...
}