首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >成员在静态成员函数中的无效使用- arduino

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

Stack Overflow用户
提问于 2019-03-11 16:01:56
回答 1查看 1.1K关注 0票数 1

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

这就是错误。

sketch\latch.cpp:在静态成员函数‘静态无效锁存::KeypadEvent(KeypadEvent)’:latch.cpp:18:11:错误:在静态成员函数开关(keypad.getState())中成员'latch:: Keypad‘的无效使用(keypad.getState()){在sketch\latch.cpp:1:0: sketch\latch.h:20:12:注意:sketch\latch.cpp:1:0中声明的文件中;^ exit status 1在静态成员函数中无效使用成员'latch::keypad’

我的代码

代码语言:javascript
复制
#include "latch.h"
latch doorlatch;

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

H档案

代码语言:javascript
复制
#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文件

代码语言:javascript
复制
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);

  }
}

有人能帮我解决这个问题吗?还是我应该用另一种方法?比如宣布它为朋友?

EN

回答 1

Stack Overflow用户

发布于 2019-03-11 17:01:14

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

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

代码语言:javascript
复制
void keypadEvent(KeypadEvent key);

由于库Keypad.h

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

你有三种可能的选择:

  • 子类class Keypad,并引入一个新的方法,用于添加回调函数,该回调函数要么是class latch的成员实例,要么是class latch的朋友;或者是一个函数,它接受对您想要访问的Keypad对象的引用作为附加参数。More Info
  • 使用Keypad单例模式(即静态的工厂方法)在全局范围提供Keypad的唯一实例,该方法总是返回对同一个Keypad实例的引用。More Info

后者就像制作一样容易

代码语言:javascript
复制
 `Keypad keypad`

在全球范围内都可以使用,实际上它比另一种更可取。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55105861

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档