菜单概念的匿名数组初始化

问题描述 投票:0回答:1

我正在尝试创建一个菜单概念,稍后可以在 8 位 MCU 和 2x16 LCD 显示屏上使用。这意味着我无法使用向量或其他奇特的库,而且我想避免动态分配一些内存。

这个想法是让代码反映菜单结构。这个概念应该适用于深度为 3 到 4 层的菜单。

菜单结构示例:

- Display
    `-> Brightness
        `-> Back
        `-> Config
- Effects
    `-> Static Light
        `-> Back
        `-> Start
            `-> Stop
    `-> Pulsing Light
        `-> Back
        `-> Start
            `-> Stop
- Games
    `-> Snake
        `-> Back
        `-> Play
    `-> TicTacToe
        `-> Back
        `-> Play

我想如何构建它(可能这就是另一种语言的方式):

class IPageView {}

class NavViewPage : IPageView {
    public:
    NavigationViewPage(const char* title, const IViewPage* pages[]);
}

void main() {
    NavViewPage masterPage = NavViewPage("Master", (const IViewPage*[]){
        &NavViewPage("Display", (const IViewPage*[]){
            &NavViewPage("Brightness", (const IViewPage*[]){
                  &NavViewPage("Back", (const IViewPage*[]){}),
                  &NavViewPage("Config", (const IViewPage*[]){})
            })
        }),

        &NavViewPage("Effects", (const IViewPage*[]){
            &NavViewPage("Static Light", (const IViewPage*[]){}),
            &NavViewPage("Pulsing Light", (const IViewPage*[]){})
        }),

        &NavViewPage("Games", (const IViewPage*[]){
            &NavViewPage("Snake", (const IViewPage*[]){}),
            &NavViewPage("TicTacToe", (const IViewPage*[]){})
        })
    });

    return 0;
}

希望你明白了。单独初始化每个对象,然后将它们传递给它们的父对象会降低可读性/减少菜单结构的概述(这样我在我的原型中使用它,并且已经感觉有点难以保持菜单结构的概述) .

我知道,如果菜单有更多的深度或更多的元素,上面的方法也会变得一团糟,但仍然有可能分割一些菜单元素并单独初始化它们(我会用完在菜单变得复杂之前闪存和 RAM 内存:D).

我也已经考虑过可变参数函数(我的意思是,如果“avr-gcc”不支持它们,我仍然可以创建多个接受 1、2、3 或 4 个对象的构造函数)。但我不确定这是否是在代码中实现草图结构的更好或唯一方法。

最后的问题是:你知道我有什么可能性来解决这个问题吗?目标是编写菜单结构易于理解、易于维护且内存使用相对较少的代码。

不要过分评价我。 C++ 不是我的主要语言,所以我每周只能使用 C++ 几个小时 :P

c++ c++11 menu avr avr-gcc
1个回答
0
投票

好吧,到目前为止我还没有找到任何好的解决方案,所以我想我会采用以下解决方案:

void staticLightEffectAction(uint8_t action);
void pulsingLightEffectAction(uint8_t action);
void changeDisplayBrightnessAction(uint8_t brightness);

namespace viewPagesConf {
    namespace mainSubs {
        namespace displaySubs {
            NavViewPage brightnessConfig = NavViewPage(changeDisplayBrightnessAction);
        }
        NavViewPage display = NavViewPage("Display", (IViewPage*[]){
            &displaySubs::brightnessConfig,
            nullptr
        });

        namespace effectsSubs {
                StartStopViewPage staticLight = StartStopViewPage("Static Light", staticLightEffectAction);
                StartStopViewPage pulsingLightLight = StartStopViewPage("Pulsing Light", pulsingLightEffectAction);
        }
        NavViewPage effects = NavViewPage("Effects", (IViewPage*[]){
            &effectsSubs::staticLight,
            &effectsSubs::pulsingLightLight,
            nullptr
        });

        namespace gamesSubs {
            StartStopViewPage snake = StartStopViewPage("Snake");
            StartStopViewPage ticTacToe = StartStopViewPage("TicTacToe");
        }
        NavViewPage games = NavViewPage("Games", (IViewPage*[]){
            &gamesSubs::snake,
            &gamesSubs::ticTacToe,
            nullptr
        });
    }
    NavViewPage master = NavViewPage("Master", (IViewPage*[]){
        &mainSubs::display,
        &mainSubs::effects,
        &mainSubs::games,
        nullptr
    });
}
IViewPage* currentPage = &viewPagesConf::master;

我不知道这种结构是否会降低可读性,但这是迄今为止我得到的最好的结构。命名空间应该避免当菜单深度增加时变量名称变大

© www.soinside.com 2019 - 2024. All rights reserved.