【问题标题】:invalid use of member in static member function - arduino在静态成员函数中无效使用成员 - arduino
【发布时间】:2019-03-11 16:01:56
【问题描述】:

我正在尝试将键盘功能调用到我自己的库中。在此之前,我有一个错误“无效使用非静态错误成员函数”并将该函数更改为静态函数。但是,由于键盘功能是非静态的,它仍然无法运行。

这是错误。

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);

  }
}

有人可以帮我解决这个问题吗?还是我应该使用不同的方法?比如宣布为好友?

【问题讨论】:

    标签: arduino


    【解决方案1】:

    问题是您有相互冲突的要求。

    一方面,通过addEventListener()方法添加的回调函数的签名只能是这样的

    void keypadEvent(KeypadEvent key);
    

    由于图书馆Keypad.h

    另一方面,您想从事件侦听器中访问class latch 内的实例Keypad keypad;,但Keypad keypad 不是回调函数的输入参数,在全局范围内也不可见。

    您有三种可能的选择:

    • 子类class Keypad并引入一个新的方法来添加一个回调函数,它要么是一个成员实例,要么是class latch的朋友;或者,一个函数,它接受对您想要访问的Keypad 对象的引用作为附加参数。 More Info

    • 使用单例模式全局范围提供Keypad的唯一实例,即始终返回对Keypad 的相同实例。 More Info

    后者可以像制作一样简单

     `Keypad keypad`
    

    在全局范围内可用,它实际上是一种比其他方法更可取的方法。

    【讨论】:

    • 我怎样才能把它变成一个 Global Scope ?我认为将“键盘键盘”放入课堂会完成同样的工作
    • 这不在全局范围内。这在class latch 实例的范围内。
    猜你喜欢
    • 1970-01-01
    • 2018-12-01
    • 2013-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多