C ++,如何在Struct中引用类方法?

时间:2016-11-16 16:12:36

标签: c++ arduino esp8266 arduino-esp8266

我正试图谦虚地将Jason Coon的“FastLED + ESP8266 Web服务器”移植到ESPAsyncWebServer https://github.com/jasoncoon/esp8266-fastled-webserver,还有一些额外的好东西...

我的项目位于https://github.com/kelexel/esp8266-fastled-async-webserver-2.0/

我对这个项目的主要工作是将所有内容包装成漂亮的类,并尝试提供某种模块化。

编辑:正如许多人在下面的评论中指出的那样,我试图完成的内容显然是错误的说明。我正在寻找的是想法,代码示例,文档,参考,应该做什么,所以我可以学习和改进......

我对C ++完全陌生,所以请放纵......

我想要实现的是获得我,新手,只能解释为对象的集合,每个对象具有String 名称和方法模式。所述模式应该是ESPLedDriver.cpp类

的方法

问题在于,在ESPLedDriver.h和ESPLedDriver.cpp中,我尝试创建一个引用ESPLedDriver ::

的Struct。

我制作了一段代码来说明问题:

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

1 个答案:

答案 0 :(得分:2)

如果所有对象都是字符串和模式,则可以将它们建模为抽象基类:

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

请注意,此设计需要将驱动程序传递给字符串模式对象。想一想这给对象一个驱动程序可以使用。