2015-04-27 2 views
0

У меня возникли проблемы с доступом к объекту или его методам в fltk. У меня есть класс с именем MyWindow, который является дочерним классом Fl_Window. , так что в основном я хотел бы использовать объект, который либо объявлен int main, либо Mywindow в приватном разделе. Моя проблема в том, что я не могу так использовать. Это позволяет мне использовать объект, если он объявлен глобальным. Могу ли я как-то поместить его в кучу, как это: Classname * pointer = new Classname(); ? ЕСЛИ я могу, где я могу это сделать? Как бы работала функция обратного вызова, если мне нужен этот объект или его функции в обратном вызове? Должен ли я использовать указатель на него в аргументах обратного вызова? позволяет сказать, что я хочу нажать кнопку, и мне нужно что-то сделать с объектом и изменить значение. много вопросов, которые я знаю, я действительно потерян. Может кто-нибудь просто укажет меня в правильном направлении? Спасибо! :)где объявить объект для его использования (fltk)

ответ

0

Простой случай для передачи данных в графическом интерфейсе

class MyData 
{ 
    // The data model 
}; 

class MyWindow: public FL_Window 
{ 
    MyData* m_data; 
public: 
    void Data(MyData* data) { m_data = data; } 
    ... 
}; 

int main() 
{ 
    MyWindow gui; 
    MyData data; 

    // Tell the gui about the data 
    gui.Data(data); 
    ... 
    // Setup the dialog 
    gui.begin(); 
    ... 
    gui.end(); 
    gui.show(); 
    return FL::run(); 
} 

Для обратных вызовов, сделать это в два этапа

class NeedingACallback 
{ 
public: 
    void Setup() 
    { 
     ... 
     FL_xxx* w = new FL_xxx(xpos, ypos, wid, hgt, name); 
     ... 
     //     v Pass the instance to the static 
     w->callback(_EventCB, this); 
    } 

    // The callback 
    static void _EventCB(FL_Widget* w, void* client) 
    { 
     // Convert the void* back to the instance 
     NeedingACallback* self = reinterpret_cast<NeedingACallback*>(client); 
     self->EventCB(); 
    } 

    // Make life simple so you don't have to put self-> in front of 
    // all the instance data accessed 
    void EventCB() 
    { 
     // Callback for this instance of the class 
    } 
}; 

EDIT Это звучит, как у вас несколько экземпляров данные. Альтернативный метод состоит в том, чтобы иметь данные в качестве ссылки. Это должно быть сделано в конструкторе. Таким образом, m_data и основные данные относятся к одной и той же области памяти.

class MyWindow: public FL_Window 
{ 
    MyData& m_data; 
public: 
    MyWindow(int wid, int hgt, MyData& data, const char* title=0) 
    : FL_Window(wid,hgt,title) 
    , m_data(data) 
    { 
    ... 
    } 
}; 

int main() 
{ 
    MyData data; 
    MyWindow gui(100, 100, data, "Call me Mr"); 

    ... 
    // Setup the dialog 
    gui.begin(); 
    ... 
    gui.end(); 
    gui.show(); 
    return FL::run(); 
} 
+0

большое спасибо !!! оно работает!!!! единственная проблема заключается в том, что это немного уродливый код: D. но я думаю, это потому, что FLTK больше C, чем C++. Благодарим вас за вашу помощь и код и время. Это очень помогает мне! – firax

+0

Единственная проблема заключается в том, что если я что-то меняю с помощью функций, это не сохраняет изменения. Поэтому я могу выполнять функции, но ничего не сохраняется. например, я настраиваю игроков, и они получают отметку X или O, которая отбрасывается обратно в вектор, но когда я вызываю функцию getMark, она возвращает случайный символ, поэтому я думаю, что он делает копию объекта и выполняет функцию запрашивается, а затем удаляется объект. Почему это так просто с глобалами и так сложно, когда все сделано правильно? – firax

+0

Вы передаете данные по значению, по ссылке или указателем? – cup

Смежные вопросы