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

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

Это ошибка.

sketch\latch.cpp: In static member function 'static void latch::keypadEvent(KeypadEvent)':

latch.cpp:18:11: error: invalid use of member 'latch::keypad' in static member function

   switch (keypad.getState()){

           ^

In file included from sketch\latch.cpp:1:0:

sketch\latch.h:20:12: note: declared here

     Keypad keypad;

            ^

exit status 1
invalid use of member 'latch::keypad' in static member function

Мой код

#include "latch.h"
latch doorlatch;

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

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 begin(int baudrate);
    void main();
    static void keypadEvent(KeypadEvent input);
    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

cpp file

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

void latch::begin(int baudrate){
  Serial.begin(baudrate);
  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);

  }
}

Может кто-нибудь помочь мне решить эту проблему?Или я должен использовать другой метод?например, объявив его другом?

1 Ответ

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

Проблема в том, что у вас противоречивые требования.

С одной стороны, подпись функции обратного вызова, добавляемой с помощью метода addEventListener(), может быть только чем-то вроде

void keypadEvent(KeypadEvent key);

из-за библиотеки Keypad.h

С другой стороны, вы хотите получить доступ к экземпляру Keypad keypad; внутри class latch из приемника событий, но Keypad keypad не является входным аргументомФункция обратного вызова не отображается в глобальной области видимости.

У вас есть три возможных выбора:

  • подкласс class Keypad и вводится новый метод добавления функции обратного вызова, которыйявляется экземпляром члена или другом class latch;или, в качестве альтернативы, функция, которая принимает в качестве дополнительного параметра ссылку на объект Keypad, к которому вы хотите иметь доступ. Подробнее

  • Предоставить уникальный экземпляр Keypad в Global Scope , используя singleton pattern , т.е.статический фабричный метод, который всегда возвращает ссылку на один и тот же экземпляр Keypad. Подробнее

Последнее может быть так же просто, как сделать

 `Keypad keypad`

доступным в глобальном масштабе, и на самом деле это гораздо большепредпочтительнее, чем другие.

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