Как динамически инициализировать класс?

Код из 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();
}
  • Вопрос задан
  • 195 просмотров
Решения вопроса 1
gbg
@gbg Куратор тега Arduino
Любые ответы на любые вопросы
Нельзя ссылку на ходу куда-то переставить. Указатель - можно.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
CityCat4
@CityCat4
Внимание! Изменился адрес почты!
Уберите тег "С" - он никакого отношения к классам не имеет.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы