Пустой указатель на указатель объекта

Я разрабатываю графический интерфейс для микроконтроллера 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

Но я не думаю, что это правильный способ сделать что-то подобное.

Большое спасибо за Вашу помощь!

0

Решение

Решение было: использование предварительного объявления в каждом классе. class Layout;

Тогда для класса TFT я должен был использовать extern SPI_TFT Screen; и в моем main.cpp я сделал SPI_TFT Screen(LCD_SDI, LCD_SDO, LCD_SCK, LCD_CS,"Screen");

(большое спасибо t.niese, гонки за легкость на орбите и Ян Худек)

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]