Arduino:未定义对“Class::attribute”的引用

Arduino: undefined reference to `Class::attribute'

我正在开发一个库 Button 来处理按钮的一些功能和一个 class ButtonManager 处理这些按钮状态的查询。我不想为 ButtonManager class 创建一个对象,所以我想我必须为每个属性和方法使用 static 关键字。此外,我正在使用第三方库来处理需要静态函数作为参数的定时器中断。 当我尝试编译我的代码时,出现 undefined reference to 'ButtonManager::head' 错误。

我的 ButtonManager.h 看起来像这样:

#ifndef BUTTON_MANAGER_H
#define BUTTON_MANAGER_H

#include <Arduino.h>
#include "Button.h"
#include "TimerOne.h"


struct ButtonListItem {
  Button* button;
  ButtonListItem* next;
};

class ButtonManager {
  public:
    static ButtonListItem* head = NULL;
    static void begin();
    static void addButton(Button* newButton);
    static void handleButtons();
};
#endif

ButtonManager.cpp 文件如下所示:

#include "ButtonManager.h"

void ButtonManager::begin() {
  Timer1.initialize(100000);
  Timer1.attachInterrupt(ButtonManager::handleButtons); // handleButtons every 0.1 seconds
}

void ButtonManager::addButton(Button *newButton) {
  ButtonListItem* link = new ButtonListItem;

  link->button = newButton;
  link->next = ButtonManager::head;

  ButtonManager::head = link;
}

void ButtonManager::handleButtons() {
  ButtonListItem* buttonPtr = ButtonManager::head;

  while (buttonPtr != NULL) {
    buttonPtr->button->handleButton();
    buttonPtr = buttonPtr->next;
  }
}

我真的不明白这个实现有什么问题。这甚至是正确的方法吗? 我将不胜感激如何改进我的代码的任何帮助和提示。

static ButtonListItem* head = NULL;

如果您想使用 static 数据成员,您还必须定义它们。此类成员的声明不是定义。

将此行放在 .cpp 文件的顶部(#include 下方):

ButtonListItem* ButtonManager::head = NULL;

您可能还需要从 header 中的声明中删除 = NULL。初始化应该用定义来完成。


至于其他事情,您应该提供一些方法来清除 按钮列表。目前无法 de-allocate 分配的内存:

ButtonListItem* link = new ButtonListItem;

(如果没有其他方拥有该内存,则可能还有 Button 本身占用的内存)。每当你使用 new 时,应该有相应的 delete。即使对于您的应用程序来说它可能无关紧要(静态 head 一直存在到执行结束)这是一个很好的做法,始终应用适当的 de-allocation。