C++ ESP8266WebServer在类内设置值
我的ESP8266Web服务器有点问题。我的WebServer{}类被封装在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
#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
}