2015-06-16 4 views
0

Я пытаюсь передать this указатель в качестве аргумента для моего callback(), но похоже, что поведение не такое же, как я ожидаю.FLTK C++ Callbakc issue

Я пытаюсь передать объект-вызывающий объект в качестве user_data (т. Е. 2-й аргумент 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() работает, потому что он ничего не понимает hin класс

T-> Order.size() не работает, потому что T прикладывается к объекту. Его следует отбросить на d.

static void SaveSettings(Fl_Widget *w, void *d){ 
    SettingsGui *T = (SettingsGui*)d; 
Смежные вопросы