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

非静态错误成员函数arduino的使用无效
EN

Stack Overflow用户
提问于 2019-03-11 09:22:34
回答 2查看 167关注 0票数 1

我正在尝试使用另一个库中的键盘库。然而,我得到了一个“无效使用非静态错误成员函数”的错误。我认为将函数更改为静态类型可以解决错误,但键盘库中的函数不是静态的,导致更多错误。

这是未将函数更改为static void时出现的错误

代码语言:javascript
复制
sketch\latch.cpp: In member function 'void latch::begin(int)':
latch.cpp:10:38: error: invalid use of non-static member function
   keypad.addEventListener(keypadEvent);
                                      ^
exit status 1
invalid use of non-static member function

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

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

-cpp.h文件

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

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

void latch::begin(int baudrate){
  Serial.begin(baudrate);
  Serial.println("Latch library created");
  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);
  }
}

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

回答 2

Stack Overflow用户

发布于 2019-03-11 10:45:48

函数

代码语言:javascript
复制
class latch {
    ...
    void keypadEvent(KeypadEvent input);
    ...
};

实际上是一个成员函数,这意味着它被隐式地指定为latch *this作为附加参数。

为了解决这个问题,将函数设为静态

代码语言:javascript
复制
class latch {
    ...
    static void keypadEvent(KeypadEvent input);
    ...
};

或者将其声明为类latch友元

代码语言:javascript
复制
class latch {
    ...
    friend:
        void keypadEvent(KeypadEvent input);
};

void keypadEvent(KeypadEvent input)
{

}

我邀请您参考有关这两个功能的大量在线文档,以便了解哪种方法更适合您的用例。

在这两种情况下,如果latch包含一些需要由keypadEvent()修改的有状态信息,那么您可能希望使用。

票数 0
EN

Stack Overflow用户

发布于 2022-01-16 05:45:37

我的错误与Patrick Trentin的原因不同。我在类MPU9250中有一个函数公共函数定义。方法是

代码语言:javascript
复制
void set_q_to_identity(){
   ...
}

在main.ino中,我按如下方式调用它

代码语言:javascript
复制
mpu.set_q_to_identity();

这产生了无效使用非静态成员编译器错误。经过一些实验,我发现问题是在方法名中使用了蛇形大小写。如果我将其更改为camel大小写,则程序成功编译,即

代码语言:javascript
复制
void setQIdentity(){
   ...
}

在main.ino中

代码语言:javascript
复制
mpu.setQIdentity();

编译成功。

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

https://stackoverflow.com/questions/55094080

复制
相关文章

相似问题

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