Arduino/C++ 指针的正确使用方法
Arduino/C++ right way to use pointers
我在用 C++ (Arduino) 编写的程序中有以下场景:
Service.h
class Service
{
public:
Service(AsyncWebServer *server, FS *fs);
~Service();
void loop();
private:
AsyncWebServer *_server;
FS *_fs;
JsonObject *Settings;
void LoadSettings();
}
Service.cpp
Service::Service(AsyncWebServer *server, FS *fs) : _server(server), _fs(fs) { }
Service::LoadSettings(){
{
File configFile = _fs->open("data.json", "r");
DynamicJsonBuffer jsonBuffer;
JsonObject &root = jsonBuffer.parseObject(configFile);
Settings = &root;
configFile.close();
}
Service:loop() {
LoadSettings();
}
在正确的程序中,一旦设置了 Settings 属性,它应该在整个生命周期中保持该值,但是我需要调用 LoadSettings() 方法一直是因为 Settings 属性 在程序退出方法 LoadSettings()
时丢失值
使用指针和 class 属性的正确方法是什么?我需要做什么?
您正在做的事情是通过解析对象文件然后离开函数来创建本地对象
DynamicJsonBuffer jsonBuffer; // declared locally
JsonObject& root = jsonBuffer.parseObject(configFile) // root local
创建 root,一个本地引用,然后在离开函数后将设置设置为指向该引用的地址,jsonBuffer
不复存在。
您应该将 jsonBuffer 声明为静态或更好,使其成为成员变量 _jsonBuffer
不确定为什么需要 root
,只写
Settings = &(_jsonBuffer.parseObject(configFile));
(也许您还应该将 Settings
重命名为 _settings
以与其他成员变量具有相同的样式)。
我在用 C++ (Arduino) 编写的程序中有以下场景:
Service.h
class Service
{
public:
Service(AsyncWebServer *server, FS *fs);
~Service();
void loop();
private:
AsyncWebServer *_server;
FS *_fs;
JsonObject *Settings;
void LoadSettings();
}
Service.cpp
Service::Service(AsyncWebServer *server, FS *fs) : _server(server), _fs(fs) { }
Service::LoadSettings(){
{
File configFile = _fs->open("data.json", "r");
DynamicJsonBuffer jsonBuffer;
JsonObject &root = jsonBuffer.parseObject(configFile);
Settings = &root;
configFile.close();
}
Service:loop() {
LoadSettings();
}
在正确的程序中,一旦设置了 Settings 属性,它应该在整个生命周期中保持该值,但是我需要调用 LoadSettings() 方法一直是因为 Settings 属性 在程序退出方法 LoadSettings()
时丢失值使用指针和 class 属性的正确方法是什么?我需要做什么?
您正在做的事情是通过解析对象文件然后离开函数来创建本地对象
DynamicJsonBuffer jsonBuffer; // declared locally
JsonObject& root = jsonBuffer.parseObject(configFile) // root local
创建 root,一个本地引用,然后在离开函数后将设置设置为指向该引用的地址,jsonBuffer
不复存在。
您应该将 jsonBuffer 声明为静态或更好,使其成为成员变量 _jsonBuffer
不确定为什么需要 root
,只写
Settings = &(_jsonBuffer.parseObject(configFile));
(也许您还应该将 Settings
重命名为 _settings
以与其他成员变量具有相同的样式)。