C++如何拼接文本与数字引用类对象 替代if-else多分支
问题解答
首先明确:C++是静态编译型语言,不支持运行时动态拼接变量名访问对象。你代码里写的dmx1/dmx2这类变量名,编译完成后就会被替换成内存地址,运行阶段根本不会保留原始变量名字符串,所以你设想的拼接名字访问对象的思路在C++里无法实现,不用往这个方向检索方案。
标准解法:使用对象数组替代分散的独立对象
你的需求本质是用整数索引访问一组同类型对象,直接把零散定义的dmx1~dmx6改成同类型的对象数组,就能完全消除冗余的if-else分支。
具体实现
- 把原本单独声明的
dmx1、dmx2……dmxN,改为对应类/结构体类型的数组:
// 把DmxChannel替换成你实际定义dmx对象时用的类名/结构体名 DmxChannel dmx[] = { {}, // 索引0位置留空,适配menuItem从1开始计数的习惯,不用每次访问都做减1计算 dmx1, // 索引1对应原dmx1对象 dmx2, // 索引2对应原dmx2对象 dmx3, dmx4, dmx5, dmx6 // 后续新增通道直接按顺序在数组后追加元素即可 };
- 直接用
menuItem作为数组下标访问成员,原print_keyboard函数可以简化为:
void print_keyboard() { tft.fillScreen(BLACK); tft.drawRoundRect(11, 40, 220, 35, 5, WHITE); tft.setCursor(15, 50); tft.setTextColor(WHITE); // 加边界判断,避免menuItem数值异常时访问非法内存导致崩溃 if (menuItem >= 1 && menuItem <= sizeof(dmx)/sizeof(dmx[0]) - 1) { tft.print(dmx[menuItem].channelName); } }
补充说明
- 如果不想浪费索引0的存储空间,也可以让数组从0位置开始存第一个dmx对象,访问时写
dmx[menuItem - 1].channelName即可,同步调整边界判断逻辑就行。 - 后续新增DMX通道时,只需要在数组里按顺序追加新对象,不需要修改打印部分的逻辑,可维护性远高于手写if-else分支。
你可能在Python、JavaScript这类解释型语言里见过动态拼接变量名的写法,但这类方案在C++里实现繁琐、运行效率低,对于你这种索引连续从1开始的场景,数组是最简单、性能最高、代码最简洁的标准实现方式。
内容的提问来源于stack exchange,提问作者LastHerd
相关产品推荐
相关产品推荐

