Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ ESP8266WebServer在类内设置值_C++_C_Esp8266 - Fatal编程技术网

C++ ESP8266WebServer在类内设置值

C++ ESP8266WebServer在类内设置值,c++,c,esp8266,C++,C,Esp8266,我的ESP8266Web服务器有点问题。我的WebServer{}类被封装在ESP8266WebServer对象周围,如下所示: 头文件: #include <WiFiClient.h> #ifndef WebServer_h #define WebServer_h #include "Arduino.h" class WebServer { public: WebServer(); void begin(); void

我的ESP8266Web服务器有点问题。我的WebServer{}类被封装在ESP8266WebServer对象周围,如下所示:

头文件:

#include <WiFiClient.h>

#ifndef WebServer_h
#define WebServer_h

#include "Arduino.h"

class WebServer {
    public:
        WebServer();
        void begin();
        void handleClient();
        void finishedProcessingData(String clientReply);
        String queryString;
    private:
        // page/url handlers
        friend void handleSomeData();
};

#endif
我的问题是,从我的外部循环(在我的主要草图中),“webServer.queryString”总是等于一个空字符串。如果我从handleSomeData()中打印出“queryString”,我可以在“handleSomeData()”中看到打印的结果(这是正确的),但它似乎无法将其设置为“在”该方法之外。我确实检查过它是否能够访问和修改一个变量(这就是为什么会打印“anumberher”)并且似乎没有问题;每次我转到相应的url时,“anumberher”都会按预期递增

我唯一的怀疑是“queryString”是一个字符串对象,由于某种原因无法设置,而“aNumberHere”是一个基本的int,这很好。这是对的还是这里发生了什么事

我也尝试过将“queryString”作为一个静态变量,但运气不好——要么是我做错了,要么就是这样也不行

我不熟悉friend函数(实际上,通常是c/c++的新手,欢迎提供任何建议),尽管我读到它应该能够很好地访问类的私有属性,所以我不确定如何解决这个问题


有什么想法吗?

有两个不同的变量称为
queryString

  • WebServer.cpp
  • WebServer.h
在回调
handleSomeData
中设置全局值,但在
循环
finishedProcessingData
中,您可以访问WebServer的成员

要使代码正常工作,您可以删除WebServer的成员并使用全局成员(就像您对Anumberher所做的那样),如下所示:

extern String queryString;

void loop(){
    delay(10);
    webServer.handleClient();

    // check if the query string has stuff in it, if it doesn't then WebServer.handleSomeData() never fired, thus no request yet
    if(queryString != ""){
        // do stuff that results in a string being returned
        processingResult = handWavyMagic();
        // then respond back to client
        webServer.finishedProcessingData(processingResult);
        queryString = "";
    }
}

我知道,对于OP来说,帮他解决问题有点晚了,但也许其他读者会觉得这很有用

为了避免在类内部和外部分割部分逻辑/数据,将所有内容都放在类内部会更加优雅。使用对类实例的非静态方法的回调有点棘手(我在当前项目中通过艰苦的学习了解到这一点),但下面是另一种选择:

void WebServer::begin()
{
    // instead of server.on("/data.html", handleSomeData);
    server.on("/data.html", std::bind(&WebServer::handleSomeData, this));
    server.begin();
}

void WebServer::handleSomeData()
{
    // do whatever you need
}

它使用std:bind()将实例方法及其
This
指针绑定到回调。因此,所有内容都包含在web服务器实例中,这是一种更干净的方法。

我更希望通过回调将值传递回它,而不是将其存储在类/全局变量中并在其他地方读取,但handleSomeData()的调用方除外是我无法控制的ESP8266WebServer对象。=/啊,我不知道“外部”关键字。查找它,似乎它可能被滥用(全局变量都是?=b),但它确实为我编译。我会给它做个测试,等我能给你回电话。谢谢。我已经有机会测试了,现在改变对我有效了。谢谢
extern String queryString;

void loop(){
    delay(10);
    webServer.handleClient();

    // check if the query string has stuff in it, if it doesn't then WebServer.handleSomeData() never fired, thus no request yet
    if(queryString != ""){
        // do stuff that results in a string being returned
        processingResult = handWavyMagic();
        // then respond back to client
        webServer.finishedProcessingData(processingResult);
        queryString = "";
    }
}
void WebServer::begin()
{
    // instead of server.on("/data.html", handleSomeData);
    server.on("/data.html", std::bind(&WebServer::handleSomeData, this));
    server.begin();
}

void WebServer::handleSomeData()
{
    // do whatever you need
}