类成员状态更新后无法获取正确值的技术求助
核心问题出在遍历std::vector<Button>时的对象传递方式:你用了值传递(Button btn : btns),每次循环都会创建一个Button对象的副本,所有对btn的操作都只作用在这个临时副本上,完全不会影响vector容器里存储的原对象。
具体错误点拆解:
- 第一个
for循环中,btn是原Button对象的副本,调用btn.update()只是把这个副本的state改成了true,循环结束后副本被销毁,vector里的原对象state还是初始的false。 - 第二个
for循环再次创建新的副本,这个副本的state自然还是初始值false;如果在这个循环里调用btn.update(),只是修改当前循环内的副本,所以能读到true,但原对象依然没变化。 - 最后一行的
btn[0].state是笔误,应该是btns[0].state,但即使修正,原对象的state始终是false,因为之前的update()从未作用在原对象上。
修复代码
只需要把遍历的变量改成引用类型,让操作直接作用在vector里的原对象上:
修改ucRP2040::update()方法:
void ucRP2040::update() { /*Input*/ for (Button& btn : btns) // 改为引用&,操作原对象 { btn.update(); } for (Button& btn : btns) // 同样改为引用& { Serial.print(" state: "); Serial.println(btn.state); // 现在能读到true了 Serial.print("size: "); Serial.print(btns.size()); Serial.print(" pin: "); Serial.print(btn.pin); } // 修正笔误,使用btns容器而非循环变量btn Serial.println(btns[0].state); // 现在也能读到true了 delay(500); }
额外优化建议(非核心修复)
构造函数里的push_back可以换成emplace_back,直接在vector内存中构造Button对象,避免不必要的临时对象拷贝:
ucRP2040::ucRP2040(std::vector<u8_t> btns, std::vector<u8_t> leds) { for (u8_t pin : btns) { this->btns.emplace_back(pin); // 直接在容器内构造对象 } }
内容的提问来源于stack exchange,提问作者andizen
相关产品推荐
相关产品推荐

