Создать экземпляр класса в конструкторе, а не над end?

Есть ли способ определить переменные класса в конструкторе или в методе, а не в верхней части документа?

В моей пользовательской библиотеке есть следующий код:

#include "DHT.h"

// Настройки DHT.
#define DHTPIN 7 // Цифровой контакт, подключенный к датчику DHT.
#define DHTTYPE DHT22 // DHT 22 (AM2302), AM2321
DHT dht(DHTPIN, DHTTYPE); // Инициализировать датчик DHT.

void DhtLib::doSomeStuff() {
  dht.begin();
  float temp = dht.readTemperature();
  ...
}

Я хотел бы иметь возможность устанавливать контакты с функцией. Но чтобы это сработало, мне нужно найти способ определить переменную dht в другом месте, а не в верхней части документа в настройках // DHT.. Лучше всего использовать такой метод, как:

void DhtLib::begin(int dhtPin) {
  DHT dht(dhtPin, DHTTYPE);
}

Это работает, но только внутри этой функции. Мне нужно, чтобы это было доступно во всем документе, а не только в одной функции.

Как этого добиться?

РЕДАКТИРОВАТЬ 1:

Весь код пользовательского файла DhtLibrary.h:

#ifndef DhtLibrary_h
#define DhtLibrary_h

#if (ARDUINO >= 100)
  #include "Arduino.h"
#else
  #include "WProgram.h"
#endif

class DhtLib {
  private:
    DHT dht;
    float readTemperatureFromDHT();
    float readHumidityFromDHT();
    float calculateHeatIndex(float temperature, float humidity);
    
  public:
    // Конструктор.
    DhtLib(int dhtPin) : dht(dhtPin, DHT22) {}

    // Методы.
    void begin();
    String getHumiTempJson();
};

#endif

Ошибка с приведенным выше кодом:

In file included from /home/myuser/Documents/Codes/temperature-control/slave2-arduino/slave2-arduino.ino:2:0:
DhtLibrary.h:12:5: error: 'DHT' does not name a type
     DHT dht;

, 👍0

1 ответ


Лучший ответ:

1

Есть множество способов сделать это. Вероятно, лучше всего иметь объект DHT в качестве свойства класса и настроить его с помощью списка инициализаторов:

#include "DHT.h"

class DhtLib {
    private:
        DHT dht;

    public:
        DhtLib(int dhtPin) : dht(dhtPin, DHT22) {}
        void begin();
        void doSomeStuff();
};

void DhtLib::begin() {
    dht.begin();
}

void DhtLib::doSomeStuff() {
    float temp = dht.readTemperature();
}

DhtLib thing(7);

void setup() {
    thing.begin();
}

void loop() {
    thing.doSomeStuff();
}
,