为这个Arduino库使用非静态成员函数



在Arduino项目(C++(中,我使用LiquidMenu库,我很难将这个类集成到自己的库中。所提供的示例对于真实场景来说过于简单。

一些不编译的代码:

main.cpp

const int rs = 3, en = 0, d4 = 4, d5 = 30, d6 = 12, d7 = 6;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
Menu menu(&lcd);
void setup() { }
void loop() { }

标题

class Menu
{
public: 
Menu(LiquidCrystal *lcd);        
private:
int _myvar;
LiquidCrystal *_lcd;
LiquidMenu _menu;
LiquidScreen _screenSetCC1;
LiquidLine line1_setupCC1;
LiquidLine line2_setupCC1;
void editIntPlus();
};

cpp

Menu::Menu(LiquidCrystal *lcd) : _lcd(lcd), _menu(*_lcd),
line1_setupCC1(0, 0, "Set CC #1"),
line2_setupCC1(0, 1, _myvar)
{

line2_setupCC1.attach_function(1, editIntPlus);
_screenSetCC1.add_line(line1_setupCC1);
_screenSetCC1.add_line(line2_setupCC1);
_menu.add_screen(_screenSetCC1);
}
void Menu::editIntPlus()
{
_myvar++;
}

第一个错误是:

错误:无效使用非静态成员函数'void Menu::editIntPlus(('

但我不能使该函数为静态函数,否则我将无法再访问_myvar。这些例子没有用处,因为它们把所有东西都放在任何类之外,这违反了编程的任何基本规则。

第二项质询。在我的菜单中,我有几十个int变量要设置。我真的不想创建很多函数来增加或减少每个var!

如何在editIntPlus()中检索当前正在编辑的var?目标是将相同的函数附加到所有vars。

我看到了这个答案,但是:

  1. 我不能将editIntPlus声明为friend:

    朋友:void editIntPlus((;

导致:

include/menu.h:82:5: error: expected primary-expression before 'void'
void editIntPlus();
^~~~
  1. 如前所述,我不想使我的函数成为static,否则我将无法再访问类成员

根据user17732522的建议,我对库进行了以下更改:

LiquidMenu.h

void (*_function[MAX_FUNCTIONS])(void *); ///< Pointers to the functions
void (*_context[MAX_FUNCTIONS]); ///< Pointers to the contexts

LiquidLine.cpp

bool LiquidLine::attach_function(uint8_t number, void (*function)(void *), void* context) {
...
_context[number - 1] = context;
...
(*_function[number - 1])(_context[number - 1]);

在我的代码中(在user17732522建议后更正(:

void editIntPlus(void *context);
line2_setupCC1.attach_function(1, [](void* context){ static_cast<Menu*>(context)->editIntPlus(context); }, this);

最新更新