arduino — C ++, как ссылаться на методы класса в структуре?

Я пытаюсь смиренно портировать «FastLED + ESP8266 Web Server» от Джейсона Куна: https://github.com/jasoncoon/esp8266-fastled-webserver ESPAsyncWebServer, с несколькими дополнительными вкусностями …

Мой проект находится здесь https://github.com/kelexel/esp8266-fastled-async-webserver-2.0/

Моя основная работа над этим проектом — обернуть все в красивые классы и попытаться позволить себе какую-то модульность.

Я совершенно новичок в C ++, поэтому, пожалуйста, будьте снисходительны ..

Я пытаюсь добиться того, что я, неофит, могу объяснить только как совокупность объектов, каждый из которых имеет строку название и метод шаблон. Сказал шаблон должен быть методом класса ESPLedDriver.cpp

Проблема заключается в том, что в ESPLedDriver.h и ESPLedDriver.cpp я пытаюсь создать структуру, которая ссылается на ESPLedDriver ::

Я сделал фрагмент кода, чтобы проиллюстрировать проблему:

ESPLedDriver.cpp

void ESPLedDriver::colorwaves()
{
// ...
}
void ESPLedDriver::palettetest()
{
// ...
}

void ESPLedDriver::setPatterns()
{
// const uint8_t patternCount;
_patterns = {

// ERROR: src/ESPLedDriver.cpp:225:3: error: cannot convert 'ESPLedDriver::colorwaves' from type 'void (ESPLedDriver::)()' to type 'ESPLedDriver::Pattern {aka void (*)()}'
{ colorwaves, "Color Waves" },

// ERROR: src/ESPLedDriver.cpp:225:3: error: cannot convert 'ESPLedDriver::palettetest' from type 'void (ESPLedDriver::)()' to type 'ESPLedDriver::Pattern {aka void (*)()}'
{ this->palettetest, "Palette Test" },
};
}

ESPLedDriver.h

#include "FastLED.h"
class ESPLedDriver
{
public:
ESPLedDriver();
// ...
private:
void setPatterns();
typedef void (*Pattern)();
typedef Pattern PatternList[];
typedef struct {
Pattern pattern;
String name;
} PatternAndName;
typedef PatternAndName PatternAndNameList[];

/* Patterns */
void colorwaves();
void palettetest();

PatternAndNameList _patterns;
uint8_t _patternCount;
}

(Или, если хотите, как суть:
https://gist.github.com/kelexel/ab5687cf83e376c709e49fbfbcfc100b )

0

Решение

Если все объекты строковые и шаблонные, вы можете смоделировать их как абстрактный базовый класс:

class String_Pattern
{
public:
virtual void pattern_method(ESPLedDriver& driver_to_use) = 0;
private:
std::string  text;
};

Обратите внимание, что этот дизайн требует передачи драйвера объекту строкового шаблона. Подумайте об этом, предоставив объекту драйвер для использования.

2

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

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

По вопросам рекламы [email protected]