在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。
我看到了这个答案,但是:
我不能将
editIntPlus
声明为friend
:朋友:void editIntPlus((;
导致:
include/menu.h:82:5: error: expected primary-expression before 'void'
void editIntPlus();
^~~~
- 如前所述,我不想使我的函数成为
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);