Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
静态成员函数中的成员使用无效-arduino_Arduino - Fatal编程技术网

静态成员函数中的成员使用无效-arduino

静态成员函数中的成员使用无效-arduino,arduino,Arduino,我正在尝试将键盘功能调用到我自己的库中。在此之前,我有一个错误“无效使用非静态错误成员函数”,并已将该函数更改为静态函数。但是,由于键盘功能是非静态的,因此仍无法运行 这就是错误所在 我的代码 #include "latch.h" latch doorlatch; void setup(){ doorlatch.begin(9600); } void loop(){ doorlatch.main(); } h文件 #include <Keypad.h> #if

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

这就是错误所在

我的代码

#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

有人能帮我解决这个问题吗?或者我应该使用不同的方法?例如将其声明为friend?

问题在于您有相互冲突的需求

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

void keypadEvent(KeypadEvent key);
由于库
键盘.h

另一方面,您希望访问实例
小键盘类闩锁
内部,但
小键盘
不是回调函数的输入参数,也不在全局范围内可见

您有三种可能的选择:

  • 子类
    类键盘
    ,并介绍一种新方法,用于添加回调函数,该函数是
    类闩锁
    的成员实例或朋友;或者,也可以是一个函数,它接受对您想要访问的
    小键盘
    对象的引用作为附加参数

  • 使用单例模式在全局范围内提供
    键盘
    的唯一实例,即始终返回对
    键盘
    相同实例的引用的静态工厂方法

后者可能和制造一样容易

 `Keypad keypad`

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

问题在于您的需求相互冲突

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

void keypadEvent(KeypadEvent key);
由于库
键盘.h

另一方面,您希望访问实例
小键盘类闩锁
内部,但
小键盘
不是回调函数的输入参数,也不在全局范围内可见

您有三种可能的选择:

  • 子类
    类键盘
    ,并介绍一种新方法,用于添加回调函数,该函数是
    类闩锁
    的成员实例或朋友;或者,也可以是一个函数,它接受对您想要访问的
    小键盘
    对象的引用作为附加参数

  • 使用单例模式在全局范围内提供
    键盘
    的唯一实例,即始终返回对
    键盘
    相同实例的引用的静态工厂方法

后者可能和制造一样容易

 `Keypad keypad`

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

如何将其纳入全局范围?我认为在课堂上使用“键盘”可以完成全球范围之外的工作。这在
类闩锁的一个实例的作用域中。如何使其成为一个全局作用域?我认为在课堂上使用“键盘”可以完成全球范围之外的工作。这在
类闩锁
的实例范围内。