где объявить объект для его использования (fltk)

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


person firax    schedule 27.04.2015    source источник


Ответы (1)


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

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
    }
};

ИЗМЕНИТЬ Похоже, у вас есть несколько экземпляров данных. Альтернативным методом является использование данных в качестве ссылки. Это нужно сделать в конструкторе. Таким образом, m_data и данные в main относятся к одной и той же области памяти.

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();
}
person cup    schedule 28.04.2015
comment
большое спасибо!!! оно работает!!!! единственная проблема в том, что это немного уродливый код: D. но я думаю, это потому, что FLTK больше C, чем C++. Спасибо за вашу помощь, код и время. Мне действительно очень помогает!! - person firax; 28.04.2015
comment
проблема только в том, что если я что-то меняю с функциями, то он не сохраняет изменения. Так что я могу выполнять функции, но ничего не сохраняется. например, я настраиваю игроков, и они получают метку X или O, которая отодвигается назад в векторе, но когда я вызываю функцию getMark, она возвращает случайный символ, поэтому я думаю, что она делает копию объекта и выполняет его функцию. запрашивается, а затем удаляет объект. Почему это так просто с глобальными переменными и так сложно, когда все сделано правильно? - person firax; 28.04.2015
comment
Вы передаете данные по значению, по ссылке или по указателю? - person cup; 28.04.2015
comment
Я думаю, что пробовал все из них, но не уверен, что делаю это правильно. Сначала я попытался использовать ваш метод, чтобы настроить указатель, указывающий на объект в main. класс MyWindow: public FL_Window { MyData* m_data; общественность: недействительные данные (данные MyData *) { m_data = данные; } ... }; затем я попробовал вот это void Data(MyData &data) {m_data = data}, затем я попробовал это void Data(MyData data) {m_data = data}, ни один из них не сработал. я думаю, что я делаю что-то не так - person firax; 28.04.2015
comment
Я думаю, у вас есть два экземпляра данных. Посмотрите на редактирование альтернативной техники - person cup; 28.04.2015
comment
это будет глупый вопрос, но если я настрою конструктор таким образом, что мне делать с этим конструктором? MyWindow (ширина int, высота int, const char * title = 0): Fl_Window (ширина, высота, заголовок) { - person firax; 29.04.2015
comment
Добавьте данные перед заголовком. Я отредактировал пример соответственно - person cup; 29.04.2015