Я разрабатываю графический интерфейс для микроконтроллера mbed в C ++, и у меня есть несколько проблем.
Ситуация такова:
Различные классы виджетов (кнопка, слайдер …) с виртуальной родительской функцией виджета. Затем макет виртуальной функции с такими классами, как (gridLayout, …). Макет имеет функции, такие как layout.add (* widget), чтобы добавить указатели виджета на вектор.
Затем у меня есть функция контроллера, которая обрабатывает события касания и использует текущий активный макет, чтобы проверить, какой правильный виджет находится в макете в координатах x, y касания.
Теперь я хочу добавить указатель, указывающий на компоновку в классе виджетов, чтобы класс контроллера мог изменить activeLayout, если это требуется. Также имеется указатель на функцию, поэтому контроллер может запускать определенную функцию при использовании виджета.
Теперь проблема: я хотел бы сделать что-то вроде этого:
Button::Button(char* text_, int color_, void *function_, Layout *layout_): text(text_), color(color_), function(function_), layout(layout_){}
Но тогда мне нужно включить класс макета, а класс макета уже включает класс виджетов -> ошибка! Какой самый простой способ сделать это? Я уже пробовал указатели void *, а затем статическое приведение к Layout, но это не сработало.
Мне также нужно включить класс TFT в каждый виджет и макет, что будет самым простым способом сделать это? Теперь у меня есть только Display.h с:
#ifndef DISPLAY_H
#define DISPLAY_H
static SPI_TFT Screen(LCD_SDI, LCD_SDO, LCD_SCK, LCD_CS,"Screen");
#endif
Но я не думаю, что это правильный способ сделать что-то подобное.
Большое спасибо за Вашу помощь!
Решение было: использование предварительного объявления в каждом классе. class Layout;
Тогда для класса TFT я должен был использовать extern SPI_TFT Screen;
и в моем main.cpp я сделал SPI_TFT Screen(LCD_SDI, LCD_SDO, LCD_SCK, LCD_CS,"Screen");
(большое спасибо t.niese, гонки за легкость на орбите и Ян Худек)
Других решений пока нет …