Код из PlatformIO ESP32 dev, Arduino framework.
Есть глобальная структура, в ней пока пустая ссылка на инстанс класса датчика dht. Если условие положительное, то нужно инициализировать ссылку на класс в этот глобальный объект, чтобы другие части программы могли пользоваться датчиком таким образом:
global.sensors.dht->method()
. Никак не получается сделать динамически. После запуска выкидывает backtrace (так как я инициализировал класс в методе init(), присваивал ссылку в глобальный объект, а потом после выполнения функции init() класс который я создал вызвал деструктор и уничтожился, ссылка в глобальном объекте как я понял уже не валидна, от этого и ошибка в runtime). Если инициализировать dht глобально (всегда, без каких либо runtime условий) и в методе init() кинуть ссылку инстанса в глобальный объект, то все работает. Но мне хотелось бы динамически инициализировать датчики, например принимая параметры по http и если в ответе будет, например
dht: true
, то инициализировать датчик и собирать данные например каждые 2 секунды. Если условие не подходит то пусть все время выполнения программы в этом глобальном объекте датчика будет просто
nullptr
// global.h
typedef struct {
SensorDht *dht = nullptr;
} GlobalSensors_t;
class Global {
public:
static void init(Global *global);
GlobalSensors_t sensors;
};
void Global::init(Global *global) {
if (/* условие */) {
global->sensors.dht = /* что-то типа &new SensorDht(...args) */
Serial.println(F("Create sensor dht"));
}
}
// main.cpp
Global global;
void setup() {
Global::init(&global);
// global.sensors.dht->init();
}