Неправильное использование нестатической ошибки члена-функции arduino - PullRequest
1 голос
/ 11 марта 2019

Я пытаюсь использовать библиотеку клавиатуры в другой библиотеке. Тем не менее, я получил сообщение «Недопустимое использование функции-члена нестатической ошибки». Я думал, что изменение функций на статический тип устранит ошибку, но тогда функции в библиотеке клавиатуры не статичны и вызывают больше ошибок.

Это ошибка без изменения функций на статический void

sketch\latch.cpp: In member function 'void latch::begin(int)':
latch.cpp:10:38: error: invalid use of non-static member function
   keypad.addEventListener(keypadEvent);
                                      ^
exit status 1
invalid use of non-static member function

------------ main.ino --------------

#include "latch.h"
latch doorlatch;

void setup(){
  doorlatch.begin(9600);
  }
 void loop(){
  doorlatch.main();
  }

----------- файл cpp.h ------------

#include "latch.h"
#include "Arduino.h"

latch::latch():keypad( makeKeymap(keys), rowPins, colPins, Rows, Cols ) {
}

void latch::begin(int baudrate){
  Serial.begin(baudrate);
  Serial.println("Latch library created");
  keypad.addEventListener(keypadEvent);

}

void latch::main(){
  keypad.getKey();
}
void latch::keypadEvent(KeypadEvent input){
  switch (keypad.getState()){
  case PRESSED:
  Serial.print("Enter: ");
  Serial.println(input);
  delay(10);
  }
}

------------ h file -------------

#include <Keypad.h>

#ifndef _latch_
#define _latch_

#if ARDUINO >= 100
#include "Arduino.h"
#else
#include "WProgram.h"
#endif

class latch {
  public:
    latch();
    void keypadEvent(KeypadEvent input);
    void begin(int baudrate);
    void main();
    Keypad keypad;
  private:
    const byte Rows = 4;
    const byte Cols = 4;

    char keys[4][4] = {
      {'1', '2', '3', 'A'},
      {'4', '5', '6', 'B'},
      {'7', '8', '9', 'C'},
      {'*', '0', '#', 'D'}
    };

    byte rowPins[4] = {7, 6, 5, 4};
    byte colPins[4] = { 11, 10, 9, 8 };
};

#endif

1 Ответ

0 голосов
/ 11 марта 2019

Функция

class latch {
    ...
    void keypadEvent(KeypadEvent input);
    ...
};

на самом деле является функцией-членом , что означает, что ей неявно присвоен latch *this в качестве дополнительного параметра.

Для решенияВ этом выпуске сделайте функцию статической :

class latch {
    ...
    static void keypadEvent(KeypadEvent input);
    ...
};

или объявите ее другом класса latch:

class latch {
    ...
    friend:
        void keypadEvent(KeypadEvent input);
};

void keypadEvent(KeypadEvent input)
{

}

Я предлагаю вам ознакомиться с обширной онлайн-документацией об этих двух функциях, чтобы понять, какой подход лучше подходит для вашего варианта использования.

В любом случае, в случае, если latch содержит некоторую информацию о состоянии, которая требуетдля изменения keypadEvent(), тогда вы можете захотеть использовать шаблон синглтона .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...