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

Я разрабатываю графический интерфейс для микроконтроллера mbed на С++, и у меня есть несколько проблем.

Ситуация такова: разные классы виджетов (кнопка, слайдер...) с виртуальной родительской функцией виджета. Затем макет виртуальной функции с такими классами, как (gridLayout, ...). Макет имеет такие функции, как layout.add(*widget) для добавления указателей виджетов к вектору. Затем у меня есть функция контроллера, которая обрабатывает события касания и использует текущий активный макет, чтобы проверить, какой правильный виджет находится в макете в координатах x, y касания.

Теперь я хочу добавить указатель, указывающий на макет в классе виджетов, чтобы класс контроллера мог изменить активный макет, если это необходимо. Существует также указатель функции, поэтому контроллер может запускать определенную функцию при использовании виджета.

Теперь проблема: я хотел бы сделать что-то вроде этого:

Button::Button(char* text_, int color_, void *function_, Layout *layout_): text(text_), color(color_), function(function_), layout(layout_){}

Но тогда мне нужно включить класс макета, а класс макета уже включает класс виджета --> error! Как это сделать проще всего? Я уже пробовал указатели void*, а затем статическое приведение к макету, но это не сработало.

Мне также нужно включить класс TFT в каждый виджет и макет, как проще всего это сделать? Теперь у меня просто есть Display.h с ним:

#ifndef DISPLAY_H
#define DISPLAY_H

static SPI_TFT Screen(LCD_SDI, LCD_SDO, LCD_SCK, LCD_CS,"Screen");

#endif

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

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


person Jannes    schedule 26.01.2014    source источник
comment
Итак, C++ XOR? Использование void * радикально различается в двух языках.   -  person    schedule 26.01.2014
comment
Извините, это C++ (в теме добавил, что это C++.   -  person Jannes    schedule 26.01.2014
comment
Я не уверен, правильно ли я понял ваш вопрос, но я думаю, что вы ищете форвардное объявление класса (class Layout;)   -  person t.niese    schedule 26.01.2014
comment
Форвардная декларация - это решение.   -  person Lightness Races in Orbit    schedule 26.01.2014
comment
Итак, я просто добавляю класс Layout; в Widget.h и он будет работать? Должен ли я сделать то же самое с экраном SPI_TFT или использовать что-то вроде extern?   -  person Jannes    schedule 26.01.2014
comment
@Jannes: Screen - это глобальный объект, и они объявляются с помощью extern (и определяются без чего-либо). Итак, extern SPI_TFT Screen; в заголовке и SPI_TFT Screen(LCD_SDI, ...) в one .cpp. С static у вас есть разные объекты в каждой единице компиляции (поскольку static означает, что вы хотите, чтобы вещь была локальной для единицы компиляции).   -  person Jan Hudec    schedule 26.01.2014
comment
Большое спасибо, ребята! Это были вещи, с которыми у меня были проблемы (я никогда не делал такой сложный кусок кода, поэтому я никогда не использовал эти вещи). Статическая вещь имеет смысл, поэтому мой экран несколько раз мигал при загрузке (инициализировался для каждого объекта). РЕДАКТИРОВАТЬ: могу ли я также просто добавить внешний экран SPI_TFT к виртуальным классам?   -  person Jannes    schedule 26.01.2014


Ответы (1)


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

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

(большое спасибо t.niese, Lightness Races in Orbit и Яну Худеку)

person Jannes    schedule 27.01.2014