Arduino / C ++ правильный способ использования указателей - PullRequest
0 голосов
/ 06 января 2019

У меня есть следующий сценарий в программе, написанной на 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();
}

В правильной программе, после того как установлено свойство Настройки , оно должно содержать значение в течение всего жизненного цикла, однако мне нужно постоянно вызывать метод LoadSettings (), поскольку Настройки * Свойство 1012 * теряет значение при выходе программы из метода LoadSettings ()

Как правильно работать с указателями и свойствами класса? Что мне нужно сделать?

1 Ответ

0 голосов
/ 06 января 2019

То, что вы делаете, - это создание локального объекта путем синтаксического анализа объектного файла и последующего выхода из функции

DynamicJsonBuffer jsonBuffer; // declared locally
JsonObject& root = jsonBuffer.parseObject(configFile) // root local

создает root, локальную ссылку, затем вы устанавливаете Настройки, чтобы указать адрес этой ссылки после выхода из функции, jsonBuffer прекращает существование.

Вместо этого вы должны либо объявить jsonBuffer статическим, либо лучше, сделать его переменной-членом _jsonBuffer

Не знаю, зачем вам нужен root, просто напишите

Settings = &(_jsonBuffer.parseObject(configFile));

(возможно, вам также следует переименовать Settings в _settings, чтобы иметь тот же стиль, что и другие переменные-члены).

...