как передать функцию-член в функцию-член другого класса - PullRequest
0 голосов
/ 11 октября 2018

Я пишу класс для доступа к глобальным переменным через строковый ввод (последовательный интерфейс, веб-интерфейс, telnet и т. Д.) На esp32.Поэтому у моего класса variableAccess есть атрибут, представляющий адрес переменной, и перечисление, указывающее тип данных (для краткости, только int и float, приведены в примере кода ниже).Затем переменная может быть установлена ​​/ прочитана методами setValue / readValue.Во время инициализации объекты variableAccess создаются и сохраняются в векторе 'allVariables'

Теперь для моей проблемы: я хочу, чтобы все эти variableAccess-объекты предоставили функцию-обработчик '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.on (), как указано в WebServer.h:

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