在多个lambdas捕获的对象上操作

Operating on objects captured in multiple lambdas

本文关键字:对象 操作 lambdas      更新时间:2023-10-16

我使用ESP8266制作了一个简单的自制物联网解决方案,并使用库中的Web服务器路由中的构建构建。这些LIB功能不喜欢与参数一起使用函数,因此我的解决方案是使用lambdas并捕获所需的变量。问题是,当尝试从两个不同lambdas的对象的同一实例操作时,使用PINPOPTOR SETETER方法来更新int存储PIN plate的int(1或0,是的,是的,我知道Bool会更好)一个lambda不会出现在另一个。

我认为这与lambdas按值捕获变量有关,并且创建了我的班级的新实例。我已经尝试捕获输出pinarray [i]作为参考,但这只是意味着getter函数无法获得正确的值,因此无法做到以切换该值的方式(内部使用Getter)。使用静态变量和GETTER函数可行,但我希望能够使用类的多个实例,因此不需要这样的共享变量。我已经看到周围的各种帖子似乎指向使用外部关键字捕获,但是我在lambdas中没有发现太多文档,也无法弄清楚如何正确使用它。

这是我正在使用的代码:

for(int i = 0; i < 1; i++) {
    server.on(path, HTTP_POST, [outputPinArray , argToCheck, i]() mutable {
        // Sets pinNumber variable and turns on or off the arduino pin using outputPinArray[i].setPinPower or .togglePinPower    
    });

    server.on(path, HTTP_GET, [outputPinArray,i](){
        // Send integer value using outputPinArray[i].getPinPower()
    });
}

输出pin类代码:

int OutputPin::getPinPower(){
    return pinPower;
}
void OutputPin::setPinPower(int value){
    if(value == HIGH || value == LOW){
        pinPower = value;
        digitalWrite(getPinNum(), pinPower);
}

任何帮助将不胜感激,谢谢!

如果我正确理解您的问题,您需要做的就是

server.on(path, HTTP_POST, [&outputPinArray , argToCheck, i]()  {

失败我的部分,在路线为ESP8266Weberver对象时,该数组脱离了范围。在@obamator

的帮助下解决