You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

类成员状态更新后无法获取正确值的技术求助

问题分析与解决方案:Button状态无法持久更新的原因

核心问题出在遍历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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 11:02:10