【问题标题】:Invalid use of non-static error member function arduino无效使用非静态错误成员函数arduino
【发布时间】:2019-03-11 01:22:34
【问题描述】:

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

这是没有将函数更改为静态无效的错误

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

------------main.ino--------------

#include "latch.h"
latch doorlatch;

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

-----------cpp.h文件------------

#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 文件-------------

#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

【问题讨论】:

    标签: arduino


    【解决方案1】:

    功能

    class latch {
        ...
        void keypadEvent(KeypadEvent input);
        ...
    };
    

    其实是一个成员函数,也就是说它被隐式赋值latch *this作为附加参数。

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

    class latch {
        ...
        static void keypadEvent(KeypadEvent input);
        ...
    };
    

    或将其声明为latch类的朋友

    class latch {
        ...
        friend:
            void keypadEvent(KeypadEvent input);
    };
    
    void keypadEvent(KeypadEvent input)
    {
    
    }
    

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

    在任何一种情况下,如果latch 包含一些需要由keypadEvent() 更改的状态信息,那么您可能想要使用singleton pattern

    【讨论】:

    • 我尝试了您的两种方法,但出现了其他错误。我正在努力理解单例模式
    • @wan 我亲自测试了这两种方法,我可以保证它们可以作为通用解决方案;但是,您的实现可能包含一些错误;如果您需要进一步的帮助,请使用新的源代码和错误消息打开一个新问题。
    • 你说的把函数改成静态函数,是不是直接在h文件里改了'static void keypadEvent(KeypadEvent input);'
    【解决方案2】:

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

    void set_q_to_identity(){
       ...
    }
    

    在main.ino中我这样称呼它

    mpu.set_q_to_identity();
    

    其中产生了invalid use of non-static member 编译器错误。经过一些实验,我发现问题在于方法名称中使用了蛇形大小写。如果我将其更改为驼峰式,则程序编译成功,即

    void setQIdentity(){
       ...
    }
    

    在 main.ino 中

    mpu.setQIdentity();
    

    编译成功。

    【讨论】:

      猜你喜欢
      • 2016-07-10
      • 2019-05-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-26
      • 1970-01-01
      • 2014-06-21
      • 1970-01-01
      相关资源
      最近更新 更多