2016-11-16 6 views
0

Ich versuche, von Jason Coon demütig Port "FastLED + Esp8266 Web Server" auf: https://github.com/jasoncoon/esp8266-fastled-webserver zu ESPAsyncWebServer, mit ein paar zusätzlichen Leckereien ...C++, Referenzieren von Klassenmethoden in einem Struct?

Mein Projekt https://github.com/kelexel/esp8266-fastled-async-webserver-2.0/

Meine Hauptarbeit zu diesem Thema befindet sich hier Projekt ist es, alles in schöne Klassen zu verpacken, und versuchen, eine Art von Modularität zu leisten.

EDIT: Wie viele in den Kommentaren unterstrichen, was ich versuche zu erreichen ist eindeutig falsch dargestellt. Alles, was ich bin auf der Suche sind Ideen, Beispielcode, docs, Referenzen, auf das, was getan werden sollte, so kann ich lernen und verbessern ...

ich C++ völlig neu bin, also bitte, nachsichtig sein ..

Was ich zu erreichen versuche ist, was ich, Neophyt, kann nur als eine Sammlung von Objekten zu erklären, jedes Objekt mit einem String Name und Methode Muster. Sagte Muster ein Verfahren der ESPLedDriver.cpp Klasse

Das Problem in der Tatsache sein soll, liegt das in ESPLedDriver.h und ESPLedDriver.cpp, ich versuche, einen Struct zu erstellen, die ESPLedDriver verweist ::

I einen Ausschnitt des Codes gemacht, das Problem zu veranschaulichen:

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; 
} 

(Oder wenn Sie es vorziehen, als Kern: https://gist.github.com/kelexel/ab5687cf83e376c709e49fbfbcfc100b)

+7

C, C#, C++ sind nicht gleich. Sie sollten sich für eines entscheiden, bevor Sie anfangen, Code zu schreiben ... – user2393256

+3

Warum Funktionszeiger verwenden, anstatt eine abstrakte Schnittstelle zu erben? –

+0

Ein Zeiger-zu-Mitglied ist kein "normaler" Zeiger. – molbdnilo

Antwort

2

Wenn alle Objekte Zeichenfolge und Muster sind, können Sie sie als eine abstrakte Basisklasse Modell:

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

Hinweis dass dieser Entwurf erfordert, dass der Treiber an das Zeichenfolgenobjekt übergeben wird. Denken Sie daran, indem Sie dem Objekt einen Treiber zuweisen.

+0

Oh ja, ich verstehe, was du meinst! Aber wie kann ich sie an die definierte 'PatternAndName patterns'-Struktur" füttern "(vorausgesetzt, eine Struktur ist immer noch der beste Weg, alle abstrakten Klassen zu gruppieren), so dass ich später etwas wie' patterns [currentPatternIndex] machen kann. Muster_Methode(); '..? – rud