FLTK C++ Callbakc 问题

Posted

技术标签:

【中文标题】FLTK C++ Callbakc 问题【英文标题】:FLTK C++ Callbakc issue 【发布时间】:2015-06-16 03:55:08 【问题描述】:

我正在尝试将 this 指针作为参数传递给我的 callback(),但它的行为似乎与我的预期不同。

我试图将调用者对象作为我的 user_data 传递(即 callback() 的第二个参数),显然它失败了!

SaveSettings() 方法中,如果我type cast void*)obj to (SettingsGui*)call foo(),它的行为符合预期(因此,我可以传递一个指针来调用SettingsGui obj?),但是当我尝试访问vector<string> Order 时(在SettingsGui::Show() 方法中填充了字符串对象),它会失败。

我对“成功传递指向调用SettingsGui object 的指针”的假设是否错误?如果是这样,为什么以及如何解决?

// Gui for Application Settings
class SettingsGui 
    vector<string> Order;
public:
    const char foo()  return "Test"; 

    void Show() 
        ...
        Order.size(); /* it is 44 here */
        ...
        // Save Button
        Fl_Button *SaveButton = new Fl_Button(...);
        SaveButton->callback(SaveSettings, this);
        ...
    

    static void SaveSettings(Fl_Widget *w, void *d)
        SettingsGui *T = (SettingsGui*)obj;
        fl_alert(T->foo()); /* this works */
        char buf[32];
        fl_alert(itoa(T->Order.size(),buf,10)); /* return -1 */

    
;

// Main Application Window
class MainApp 
public:
    void Show()
        ...
        ...
        Fl_Button *flButton_settings = new Fl_Button(...);
        flButton_settings->callback(OpenSettingsGui);
    

    static void OpenSettingsGui (Fl_Widget *w, void *d) 
        SettingsGui p;  
        p.ReadSettings(...);
        p.Show();   
    
;

【问题讨论】:

【参考方案1】:

T->foo() 有效,因为它不访问类中的任何内容

T->Order.size() 不起作用,因为 T 被强制转换为 obj。它应该被强制转换为 d。

static void SaveSettings(Fl_Widget *w, void *d)
    SettingsGui *T = (SettingsGui*)d;

【讨论】:

以上是关于FLTK C++ Callbakc 问题的主要内容,如果未能解决你的问题,请参考以下文章

使用 FLTK 在形状中填充颜色的 C++ 不适用于圆形

C++ FLTK 1.30 MSVCR120.dll 丢失

带有 Microsoft Visual C++ 2010 Express 的 FLTK-1.1.10

如何在 C++ 和 FLTK 中实现倒计时时钟?

在 C++ 中使用 FLTK 的简单电话簿

C++ 动态显示或隐藏 FLTK 小部件?