我正在尝试将键盘功能调用到我自己的库中。在此之前,我遇到了一个错误“无效使用非静态错误成员函数”,并将该函数更改为静态函数。但是,由于键盘功能是非静态的,因此它仍然无法运行。
这是错误。
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文件
#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文件
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);
}
}
有人可以帮我解决这个问题吗?还是应该使用其他方法?例如宣布为好友?
答案 0 :(得分:0)
问题是您的要求相互矛盾。
一方面,通过addEventListener()
方法添加的回调函数的签名只能是
void keypadEvent(KeypadEvent key);
由于库Keypad.h
另一方面,您想从事件监听器中访问Keypad keypad;
内的实例class latch
,但是Keypad keypad
不是回调函数的输入参数,也不是全球范围。
您有三个可能的选择:
子类class Keypad
,并引入了一种新的方法来添加回调函数,该函数可以是成员实例或class latch
的朋友;或者,该函数接受您要访问的Keypad
对象的引用作为附加参数。 More Info
使用单一模式在 Global Scope 中提供Keypad
的唯一实例,即始终返回引用的静态工厂方法到Keypad
的同一实例。 More Info
后者可能像制作
一样容易 `Keypad keypad`
可在全球范围内使用,实际上它是比其他方法更可取的方法。