如何在Struct中引用类方法

C++, How to reference Class methods in a Struct?

本文关键字:引用 类方法 Struct      更新时间:2023-10-16

我正试图谦虚地移植"FastLED + ESP8266 Web服务器"由Jason Coon: 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::

的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)

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

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

注意,这种设计需要将驱动程序传递给字符串模式对象。想象一下,这给了对象一个要使用的驱动程序。