如何将成员函数传递给另一个类的成员函数

时间:2018-10-11 12:09:59

标签: c++ c++11 arduino member esp32

我正在编写一个类来通过esp32上的字符串输入(串行,Web界面,telnet等)访问全局变量。因此,我的variableAccess类具有一个表示变量地址的属性和一个指定数据类型的枚举(在下面的示例代码中,仅将int和float简化为该枚举)。 然后可以通过setValue / readValue方法设置/读取变量。 在初始化期间,将创建variableAccess对象并将其存储在向量“ allVariables”中

现在解决我的问题:我希望所有那些variableAccess-objects提供一个处理函数“ wi_handle”,然后可以将其传递给WebServer方法,但是由于“无效使用非静态成员”,我遇到了错误功能'。经过研究之后,我现在理解了为什么“ wi_handle”必须是静态的,但是我仍然不确定如何实现我必须实现的功能(在网络界面上创建子域和相应的处理程序)。

我的代码:

#include <vector>
#include <locale>

#ifndef WebServer
#include <WebServer.h>
#endif

#ifndef server(80)
WebServer server(80);
#endif

enum ACCESS {NONE, READ, WRITE, READWRITE};
enum DATATYPE {INT,FLT};

class Variabel_Access {
    public:
      Variabel_Access(int *varPointer, String varName, ACCESS pAccess);
      Variabel_Access(float *varPointer, String varName, ACCESS pAccess);

      long int variablePointer;
      String variableName;
      ACCESS variableAccess;
      DATATYPE datatype;

      String readValue();
      String setValue(String value);

      //WI start
      void wi_handle ();
      //WI end
};

Variabel_Access::Variabel_Access (int* varPointer, String varName, ACCESS varAccess=READWRITE) {
  variablePointer=(long int) varPointer;
  variableName=varName;
  variableAccess=varAccess;
  datatype=INT;
}
Variabel_Access::Variabel_Access (float* varPointer, String varName, ACCESS varAccess=READWRITE) {
  variablePointer=(long int) varPointer;
  variableName=varName;
  variableAccess=varAccess;
  datatype=FLT;
}

String Variabel_Access::readValue () {
  if (!(variableAccess==READ || variableAccess==READWRITE)) {
    return "ERROR: no access";
  }
  switch(datatype) {
    case INT:{
      int& i = *reinterpret_cast<int*>(variablePointer);
      return String(i);}
    case FLT:{
      float& f = *reinterpret_cast<float*>(variablePointer);
      return String(f);}
    default:{
      return "ERROR: type error";}
  }
}

String Variabel_Access::setValue (String valuestring) {
  if (!(variableAccess==WRITE || variableAccess==READWRITE)) {
    return "ERROR: no access";
  }

  String response="";
  switch(datatype) {
    case INT:{
      int value = atoi(valuestring.c_str());
      *(int*)(variablePointer)=value;
      return "done";}
    case FLT:{
      float value = atof(valuestring.c_str());
      *(float*)(variablePointer)=value;
      return "done";}
    default:{
      return "ERROR: type error";}
  }
}

void Variabel_Access::wi_handle () {
  String value=readValue();
  server.send(200, "text/plane", value);
}

std::vector<Variabel_Access> all_variables;

int integer_variable=100;
float float_variable=19.17;

void setup() {
  all_variables.push_back( Variabel_Access(  &integer_variable, "myInteger", READ) );
  all_variables.push_back( Variabel_Access(  &float_variable, "myFloat") );

  for (int i=0; i<all_variables.size();i++) {
    server.on("/"+all_variables[i].variableName, all_variables[i].wi_handle);
  }
}

void loop() {
  delay(10000);
}
如WebServer.h中所述

编辑: webserver.on():

typedef std::function<void(void)> THandlerFunction;
void on(const String &uri, THandlerFunction handler);

0 个答案:

没有答案