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 以与其他成员变量具有相同的样式)。