У меня проблема с доступом к объекту или его методам в fltk. У меня есть класс с именем MyWindow, который является дочерним классом Fl_Window. поэтому в основном я хотел бы использовать объект, который либо объявлен в основном, либо Mywindow в частном разделе. Моя проблема в том, что я не могу использовать его таким образом. Это позволяет мне использовать объект только в том случае, если он объявлен глобальным. Могу ли я как-то поместить его в кучу следующим образом: Classname *pointer = new Classname(); ? ЕСЛИ я могу, где я могу это сделать? Как будет работать функция обратного вызова, если мне нужен этот объект или его функции в обратном вызове? Должен ли я использовать указатель на него в аргументах обратного вызова? скажем, я хочу нажать на кнопку, и мне нужно, чтобы она что-то сделала с объектом и изменила значение. много вопросов я знаю, я действительно потерян. Может ли кто-нибудь просто указать мне правильное направление? Благодарю вас! :)
где объявить объект для его использования (fltk)
Ответы (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
большое спасибо!!! оно работает!!!! единственная проблема в том, что это немного уродливый код: D. но я думаю, это потому, что FLTK больше C, чем C++. Спасибо за вашу помощь, код и время. Мне действительно очень помогает!!
- person firax; 28.04.2015
проблема только в том, что если я что-то меняю с функциями, то он не сохраняет изменения. Так что я могу выполнять функции, но ничего не сохраняется. например, я настраиваю игроков, и они получают метку X или O, которая отодвигается назад в векторе, но когда я вызываю функцию getMark, она возвращает случайный символ, поэтому я думаю, что она делает копию объекта и выполняет его функцию. запрашивается, а затем удаляет объект. Почему это так просто с глобальными переменными и так сложно, когда все сделано правильно?
- person firax; 28.04.2015
Вы передаете данные по значению, по ссылке или по указателю?
- person cup; 28.04.2015
Я думаю, что пробовал все из них, но не уверен, что делаю это правильно. Сначала я попытался использовать ваш метод, чтобы настроить указатель, указывающий на объект в 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
Я думаю, у вас есть два экземпляра данных. Посмотрите на редактирование альтернативной техники
- person cup; 28.04.2015
это будет глупый вопрос, но если я настрою конструктор таким образом, что мне делать с этим конструктором? MyWindow (ширина int, высота int, const char * title = 0): Fl_Window (ширина, высота, заголовок) {
- person firax; 29.04.2015
Добавьте данные перед заголовком. Я отредактировал пример соответственно
- person cup; 29.04.2015