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。
我正在开发一个库 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。