2016-11-16 3 views
0

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

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

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

EDIT: Как указано в комментариях ниже, то, что я пытаюсь выполнить, явно неверно проиллюстрировано. Все, что я ищу идеи, примеры кода, документы, ссылки на то, что должно быть сделано, так что я могу учиться и совершенствоваться ...

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

То, что я пытаюсь выполнить, - это получить то, что я, неофит, может объяснить только как совокупность объектов, каждый объект имеет строку имя и метод pattern. Указанный шаблон должен быть метод ESPLedDriver.cpp класса

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

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

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)

+7

C, C#, C++ - это не то же самое. Вы должны решить один из них, прежде чем начинать писать код ... – user2393256

+3

Зачем использовать указатели функций вместо наследования абстрактного интерфейса? –

+0

Указатель на элемент не является «регулярным» указателем. – molbdnilo

ответ

2

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

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

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

+0

О да, я понимаю, что вы имеете в виду! Но чем я могу «прокормить» их до определенной структуры шаблонов PatternAndName? (Предполагая, что структура по-прежнему является наилучшим способом группировать все абстрактные классы), поэтому я могу позже сделать что-то вроде 'patterns [currentPatternIndex]. pattern_method(); '...? – rud

Смежные вопросы