Я делаю немного IDE
и во время программирования я сталкиваюсь с небольшой трудностью, которую пытаюсь объяснить.
У меня два слоя (cpp
файлы), один для объектов более низкого уровня (сам объект, вектор и т. д.) и один для более высокого уровня ( IDE
уровень, как кнопки и т. д.):
в entities.h
struct EntityComponent{
};
struct a_component : EntityComponent{ //cannot change this
};
struct Entity{
... //entity data like childs, parent, transforms, and so on
std::vector<EntityComponent*> components;
};
в ide.h
struct GuiButton{...};
struct GuiProperty{...};
Теперь я хочу, чтобы каждая сущность и каждый компонент брали указатель на более высокий тип, объявленный в слое ide.h, например элемент gui для рисования данных сущности или компонента, поэтому я сделал:
в ide.h
struct EditorEntity : Entity{
GuiProperty* properties;
};
struct EditorEntityComponent: EntityComponent{
GuiProperty* properties;
};
я могу использовать EditorEntity
в IDE
вместо сущности и использовать свойства.
Проблема возникает, когда я хочу сделать то же самое с EntityComponent
структура: каждый компонент в нижнем слое объявляется наследующим EntityComponent
структура, поэтому я не могу изменить это значение, потому что статически объявляется в каждом определении компонента.
мне нужно EditorEntityComponent
: EntityComponent
который содержит более высокий тип свойства, но я не хочу размещать уродливый указатель в EntityComponent
магнезии.
Любая помощь?
Вы говорите о «композитном» дизайне шаблона https://en.wikipedia.org/wiki/Composite_pattern
Пример в знаменитой книге «Шаблоны проектирования» (Гамма, Хелм, Джонсон и Влиссидес) на самом деле представляет собой графический редактор, именно для которого вы пытаетесь его использовать. Если вы можете овладеть этим, прочитайте эту главу.
Даже если следовать хорошо известным правилам, есть много способов сделать что-то. То, что следует, полностью мое собственное мнение:
Ошибка, которую вы совершаете, заключается в том, что вы пытаетесь использовать систему ввода для управления тем, какие компоненты могут быть присоединены к другим компонентам. Но иерархия древовидной структуры должна быть одинаковой сверху вниз, чтобы быть легкой и надежной.
Вместо этого вы можете контролировать, какие компоненты разрешены для каждого класса, возлагая на него ответственность за их создание. Если ваш редактор сущностей создает каждый из своих компонентов редактора сущностей, то никакой другой класс никогда не сможет присвоить ему неправильный тип.
Других решений пока нет …