首页 > 编程语言 >C++面向对象多级菜单向Arduino的移植

C++面向对象多级菜单向Arduino的移植

时间:2024-06-23 13:20:37浏览次数:29  
标签:菜单 HeleMenuViewer Arduino C++ 面向对象 m1 m2 HeleMenu display

前段时间写了一篇文章《C++面向对象语言自制多级菜单》,文中指出了可以将HeleMenu库进行移植,现已完成技术思路,特此记录。

一、特性

基本与上一篇文章指出的一致,只是将菜单显示和响应函数合二为一

二、代码实现

基本与上一篇文章指出的一致,只是考虑到右值和左值的问题,将形参改为了const类型

三、使用示例

(一)手动生成

void setup() {
    /*手动生成菜单,测试用例3*/
    HeleMenu *m1 = new HeleMenu("Root");
    m1->attachAction(display_root);
    HeleMenuViewer::init(m1); //初始化根菜单

    HeleMenu *m2 = new HeleMenu("Log",m1);
    m2->attachAction(display_log);
    m2->addToMenus();

    m2 = new HeleMenu("Opt",m1);
    m2->addValues({"save","unsave"});
    m2->attachAction(display_opt);
    m2->addToMenus();

    m2 = new HeleMenu("Menu",m1);
    m2->attachAction(display_menu);
    m2->addToMenus();
    m1 = m2; //构建下一层子菜单

    m1->addValues({"1.Adjust", "2.About"});

    HeleMenuViewer::gotoRoot();	 //到达根菜单
}

void loop() {
    //显示与响应 
    lcd.clear();
    HeleMenuViewer::action();
    _delay_ms(50);
}

(二)脚本生成

void setup() {
    /*脚本生成菜单*/
    //测试用例1
    void (*p_display[])(const string&, const vector<string>&, uint8_t&) = {/*root*/display_root, /*log*/display_log, /*operate*/display_opt, /*menu*/display_menu};
    HeleMenu *m1 = HeleMenu::parseMenu("Root{Log{},Opt{save,unsave},Menu{0.Contrast,2.About}}",	p_display);
    HeleMenuViewer::init(m1);
    
    //测试用例2
    // void (*p_display[])(const string&, const vector<string>&, uint8_t&) = {/*root*/display_root, /*log*/display_log, /*operate*/display_opt, /*menu*/display_menu};
    // HeleMenu *m1 = HeleMenu::parseMenu("{Log{},Opt{save,unsave},Menu{0.Contrast,2.About}}",	p_display);
    // HeleMenuViewer::init(m1);

    HeleMenuViewer::gotoRoot();	 //到达根菜单
}

void loop() {
    //显示与响应 
    lcd.clear();
    HeleMenuViewer::action();
    _delay_ms(50);
}

(三)演示

菜单结构如下:

 -Root
    -Log
      -XX
      -...
    -Opt
      -save
      -unsave
    -Menu
      -Contrast
      -About

四、参考资料

五、源码下载

https://download.csdn.net/download/hele_two/89472615

标签:菜单,HeleMenuViewer,Arduino,C++,面向对象,m1,m2,HeleMenu,display
From: https://www.cnblogs.com/hele-two/p/18263317

相关文章

  • C++ 智能指针
     问题引入intfunc1(intx){ inty=10; int*tmp=(int*)malloc(sizeof(int)*2); if(x==0) throw"func1_error"; else returnx+y; free(tmp);//抛异常造成异常安全问题,无法释放造成内存泄漏,}intmain(){ try{inta=func1(0);} catch(constc......
  • C++入门 vector深度剖析及模拟实现
    目录vector析构函数模拟实现vector赋值拷贝模拟实现vector拷贝构造模拟实现vector构造函数模拟实现类模板的成员函数n个val构造单参数和多参数对象隐式类型转换使用memcpy拷贝问题在上两篇有关vector的模拟实现中,还有构造,拷贝构造,赋值拷贝以及析构函数没有实现,本篇主......
  • 第一百二十节 Java面向对象设计 - Java接口方法
    Java面向对象设计-Java接口方法方法声明您可以在接口中声明三种类型的方法:抽象方法静态方法默认方法在Java8之前,您只能在接口中声明抽象方法。修饰符static和default用于分别声明静态和默认方法。缺少静态和默认修饰符使得方法抽象。以下是具有所有三种类型方法的接口......
  • C++ 20新特性之改进的位操作
    ......
  • 【小沐学GIS】Google的kml文件的读写(C++、Python)
    文章目录1、简介1.1kml简介1.2功能点1.2.1地标1.2.2地面叠加层1.2.3路径1.2.4多边形2、下载和编译3、C++测试4、Python测试4.1安装库4.2测试14.2测试24.3测试3结语1、简介https://developers.google.cn/kml/documentation/kmzarchives?hl=zh-cn1.1kml......
  • C++ 结构体对齐详解
    目录前言一、为什么要对结构体进行对齐操作?二、基本概念三、对齐规则四、示例讲解1.简单的变量对齐2.结构体包含有结构体的对齐结构体成员详细解析五、使用指令改变对齐方式__attribute__((packed))#pragmapack(push,n)#pragmapack(pop)六、总结前......
  • 2024年华为OD机试真题-生成哈夫曼树-(C++/Java/python)-OD统一考试(C卷D卷)
    题目描述给定长度为n的无序的数字数组,每个数字代表二叉树的叶子节点的权值,数字数组的值均大于等于1。请完成一个函数,根据输入的数字数组,生成哈夫曼树,并将哈夫曼树按照中序遍历输出。为了保证输出的二叉树中序遍历结果统一,增加以下限制:二叉树节点中,左节点权值小于右节点......
  • 【C++进阶学习】第三弹——菱形继承和虚拟继承——菱形继承的二义性和数据冗余问题
    继承(上):【C++进阶学习】第一弹——继承(上)——探索代码复用的乐趣-CSDN博客继承(下):【C++进阶学习】第二弹——继承(下)——挖掘继承深处的奥秘-CSDN博客前言:在前面,我们已经讲过继承的相关知识,今天我们来将一个由继承拓展出来的很重要的知识,那就是——菱形继承和虚拟继承及相关知......
  • 动态内存分配(C++)
    什么叫动态分配?动态分配的优点动态分配的语法解释动态分配的变量动态分配的数组动态分配的结构体参考什么叫动态分配?形象来说,动态分配就像是在一个大型购物广场中,你根据需要随时租用或归还一个店铺。程序运行时,如果需要更多空间来存储数据,就会向操作系统“租用”内......
  • 深入讲解C++基础知识(一)
    目录一、基本内置类型1.类型的作用2.分类3.整型3.1内存描述及查询3.2布尔类型——bool3.3字符类型——char3.4其他整型4.有符号类型和无符号类型5.浮点型6.如何选择类型7.类型转换7.1自动类型转换7.2强制类型转换7.3类型转换总结8.类型溢出8.1注意......