как передать функцию-член в функцию-член другого класса

Я пишу класс для доступа к глобальным переменным через ввод строки (последовательный интерфейс, веб-интерфейс, 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);

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector