Как изменить область действия объекта?

Я использую пример File/Examples/Adafruit MQTT Library/mqtt_ESP8266 в качестве модели для своего кода. В примере объект mqtt создается как глобальная переменная, и все работает нормально. Однако мне нужно создать объект mqtt в setup(), потому что до этого параметры конструктора неизвестны. Если я перенесу вызов конструктора

Adafruit_MQTT_Client mqtt(&client, AIO_SERVER, AIO_SERVERPORT, AIO_USERNAME, AIO_KEY);

из глобального пространства имен внутрь setup(), я больше не вижу его внутри loop().

Я попытался объявить указатель на mqtt в глобальном пространстве имен, но не знаю, как изменить его, чтобы он указывал на объект mqtt, созданный в setup(). Как мне это сделать?

Дэвид

, 👍1


1 ответ


1

В общем, есть несколько способов сделать это, ни один из них не является идеальным...

  1. указать на mqtt в глобальном масштабе Adafruit_MQTT_Client * mqtt_ptr; и инициализировать его с помощью mqtt_ptr = new Adafruit_MQTT_Client(&client, AIO_SERVER, AIO_SERVERPORT, AIO_USERNAME, AIO_KEY); в настраивать. Затем вам нужно использовать оператор стрелки вместо точки для доступа к его методам. Или вы можете создать псевдоним в цикле (или всякий раз, когда вам это нужно) с помощью Adafruit_MQTT_Client& mqtt = *mqtt_ptr; и получить к нему доступ так же, как и раньше.
  2. возвращает ссылку на статическую переменную, созданную внутри функции (синглтон), но вы должны предоставлять параметры каждый раз, даже если они нужны только в первый раз. Статическая переменная создается только при первом вызове функции.
  3. Для esp8266 может быть доступен шаблон std::Optional. Это похоже на указатель, но вам не нужно использовать оператор стрелка ->. Но может быть посторонняя копия, когда вы назначаете (создаете) ее значение.
  4. Вы также можете расширить 1. или 2. собственным классом для хранения параметров, а затем вернуть экземпляр Adafruit_MQTT_Client
,