Estoy trabajando en un sistema integrado que interactúa con el usuario con varios botones y una pequeña pantalla gráfica.
Como nota al margen: dado que estoy en un sistema embebido, me gustaría evitar la asignación de memoria dinámica tanto como sea posible. Algo como std :: vector ni siquiera está disponible.
Necesito implementar un menú de configuración usando una estructura de menú anidada clásica como esta:
Level A Node 1
-> Level B Node 1
-> Level C Node 1
-> Level B Node 2
-> Level B Node 3
Level A Node 2
Level A Node 3
No estoy muy seguro sobre el mejor enfoque aquí. Leí acerca de varias formas de abordar algo como esto, como usar el patrón compuesto. Sin embargo, siempre me encuentro con algo que se veía bien "en papel", pero parece ser un desastre para implementar.
Mi pensamiento general es tener algo que una MenuNode
clase sepa sobre sus subnodos y el nodo primario al momento de la inicialización. Una Menu
clase podría manejar la navegación y el procesamiento del nodo. Obviamente, cada uno MenuNode
tiene que ejecutar / implementar comportamientos específicos como:
- Informe a
Menu
lo que quiere mostrar (el diseño / posicionamiento real no debería ser asunto delMenuNode
) - Reaccionar a la entrada del usuario (como presionar un botón para aumentar / disminuir / cambiar un valor)
- Acceda al valor real de interés (residen en una
ApplicationSettings
clase)
¿Cuál sería la mejor manera de implementar esto?
Use una
MenuNode
clase base (abstracta) y cree una subclase para CADA elemento de nodo de menú. Durante la inicialización, podría proporcionar un punteroApplicationSettings
u otras dependencias que pueda necesitar. De alguna manera se siente mal crear como 10 clases derivadas donde cada una se instanciará solo una vez.Use la misma
MenuNode
clase para cada nodo e implemente la funcionalidad a través de devoluciones de llamada para liberar funciones. Por lo que leí, es bastante común "emparejar" funciones gratuitas con objetos. Sin embargo, parece que complicaría demasiado las cosas. Para cada miembro puede haber, como ReportButtonPress () o algo así, tendría que proporcionar la devolución de llamada para la implementación real durante la inicialización.Estoy seguro de que hay algo que estoy pasando por alto aquí.