BRAGA96
@BRAGA96

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

Здравствуйте. Как правильно инициализировать класс внутри метода другого класса?
Данный код рабочий, но есть сомнения, что есть более правильные способы.
Как правильно описать инстанс класса в .h файле, чтобы он не инициализировался сразу без параметров, а дать ему понять, что он будет инициализироватся позже, например, в методе класса или его конструкторе?

// SensorDht.h
class SensorDht {
	private:
		DHT* dht;
		uint8_t pin;
		uint8_t type;

	public:
		SensorDht(uint8_t pin, uint8_t type);
		void init();
};

// SensorDht.cpp
SensorDht::SensorDht(uint8_t pin, uint8_t type) {
	this->pin = pin;
	this->type = type;
}

void SensorDht::init() {
	DHT instance(this->pin, this->type);
	this->dht = &instance;
	this->dht->begin();
}


UPD: Способ не совсем рабочий, дальше по коду я получаю исключение: stack smashing protector failure esp32
Если инициализировать вот так, то все работает хорошо, но требует дополнительной инициализации в коде, чего хотелось бы избежать для чистоты кода:
DHT dht(GPIO_NUM_17, DHT22);
SensorDht sensor_dht(&config, &dht);

SensorDht::SensorDht(Config* config, DHT* dht) {
	this->config = config;
	this->dht = dht;
}

void SensorDht::init() {
	this->dht->begin();
}
  • Вопрос задан
  • 185 просмотров
Решения вопроса 2
zagayevskiy
@zagayevskiy
Android developer at Yandex
Это инстанс уничтожается, когда ты выходишь из метода, поэтому нельзя ссылку на него хранить. Используй dht = new SensorDht(pin, type)

А вообще в современном С++ вроде как не приветствуется использование сырых указателей.
Ответ написан
devalone
@devalone
̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻
В данном случае, просто храни DHT не по указателю.

class SensorDht {
  private:
    DHT dht;

// ...

SensorDht::SensorDht(uint8_t pin, uint8_t type) : dht(pin, type) {
  this->pin = pin;
  this->type = type;
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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