Застрял на пару дней с проблемой. Я был вынужден изучить c++ для задания проекта, которое включало gtk. Мне удалось запрограммировать нужные мне окна и большинство функций, но я могу окунуться в голову, как решить задачу хранения данных из функции обратного вызова!
Прежде чем продолжить, я просто хочу добавить, что я ищу в сети ответы, но не наткнулся на ту же проблему. Я знаю, что я не могу вызвать функцию из статической функции обратного вызова
Во всяком случае, задействованы 3 основных класса (среди прочих):
В определенный момент при запуске программы пользователь захочет ввести новые координаты. Слушатель клавиатуры слышит, когда нажата конкретная кнопка и внутри класса, вызывается функция класса Window и отображается диалоговое окно ввода.
Window *window; //Header
....
void Keyboard::GetInputCoord(){ //.cpp
window->display();
}
окно ссылается в Keyboard.h и связано в основном классе следующим образом:
....
keyboard.window = &window;
keyboard.buff_read = &buff;
window.buff_write = &buff;
....
У меня есть класс Window, display(), которому удалось отправить массив моих записей в статическую функцию обратного вызова, но теперь мне трудно понять, как отправить это в мой буфер? Я попытался вызвать функцию из того же класса, но бесполезно...
static void entry_coord(GtkButton *widget, GtkWidget **entry)
{
GtkWidget *entry_x_in = entry[0];
GtkWidget *entry_y_in = entry[1];
const char *x, *y;
x = gtk_entry_get_text(GTK_ENTRY(entry_x_in));
y = gtk_entry_get_text(GTK_ENTRY(entry_y_in));
// write_buff(x, y); <- something like this
}
Так как я не могу назвать эту функцию, которую я объявил в Window.h и реализовал в.cpp, какие у меня есть параметры? Есть ли какие-то проблемы?
Редактировать 10 января 2015 г.
window.h
#ifndef def_Window
#define def_Window
#include <stdio.h>
#include <stdlib.h>
#include <string>
#include <ncurses.h>
#include <gtk/gtk.h>
#include "Buffer.h"
using namespace std;
class Window
{
public:
Window();
void display();
void write_buff(const char, const char);
Buffer *buff_write; //Sound maybe be in private
private:
};
buffer.h
#ifndef def_buffer
#define def_buffer
#include <stdio.h>
#include <stdlib.h>
#include <string>
#define BUFF_ROW 10
#define BUFF_COL 2
using namespace std;
class Buffer
{
public:
Buffer();
void write_to_buffer(string msg);
void read_from_buffer();
private:
int front, back, size, count;
string buffer[][];
};
#endif
Keyboard.h
#ifndef def_Keyboard
#define def_Keyboard
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <string>
#include <boost/filesystem.hpp>
#include <boost/thread.hpp>
#include <gtk/gtk.h>
#include "Kinematic.h"
#include "Window.h"
#include "Buffer.h"
#define MSG 10
using namespace std;
class Keyboard
{
public:
Keyboard();
void UpdateMessages();
void SetStatus(string msg);
void SetMessage(string msg);
string messages[10];
int indexMsg;
string statusString;
....
Window *window;
Buffer *buff_read;
private:
};
Я пробовал несколько способов записи в буфер. Я попытался вызвать функцию Buffer write_to_buffer(), и я попытался позвонить из функции Window write_buff(), которая вызывает write_to_buffer. Компилятор говорит, что функции не объявляются в этой области.
Вы можете решить эту проблему, entry_coord()
указатель userdata для entry_coord()
что позволит вам получить доступ ко всему, что вам нужно в этой функции. Ваша идея структуры, которая имеет указатели на записи и буфер, безусловно, будет работать, но мне кажется, что ваш класс Window должен работать так же хорошо... Просто используйте this
как указатель данных и сделайте обратный вызов похожим на это:
static void entry_coord(GtkButton *widget, gpointer data_ptr)
{
auto window = static_cast<Window*> (data_ptr);
window->update_buff_from_entries();
}
Тогда ваш класс Window, естественно, должен содержать (частные) указатели на записи, чтобы новый публичный метод update_buff_from_entries()
мог получать из них значения и вызывать write_buff()
.
write_buff()
таким образом? Можете ли вы предоставить хотя бы ваши заголовочные файлы?