如何在回调中使用结构的参数化成员函数?

问题描述 投票:0回答:1

我有一个看起来像下面的结构

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接受不带附加参数的函数名。

我该如何完成?

c++ struct gnome
1个回答
0
投票

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);
    // ...
}
© www.soinside.com 2019 - 2024. All rights reserved.