Создать экземпляр класса в конструкторе, а не над 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();
}
,

Спасибо за быстрый ответ! Не могли бы вы уточнить часть DhtLib(int dhtPin) : dht(dhtPin, DHT22) {}? Я не совсем понимаю части того, что он делает точно. Это все еще определение конструктора? И разве я не должен также объявлять DHT dht из DhtLibrary.h в файле DhtLibrary.cpp?, @Socrates

Это «список инициализаторов». Да, это конструктор. Когда вы создаете, он передает переменные объекту DHT, который вы установили в разделе «private». DHT dht объявлен внутри класса DhtLib., @Majenko

Хорошо понял. Что ж, если я помещу DHT dht в раздел private:, компилятор будет недоволен и выдаст ошибку DhtLibrary.h:20:5: ошибка: 'DHT' не указывает тип. Ожидается DHT dht(DHTPIN, DHTTYPE);., @Socrates

Какую библиотеку вы используете? Тот, что у меня здесь, отлично работает., @Majenko

Я использую «библиотеку датчиков DHT» от Adafruit версии 1.3.10. Какой из них вы используете?, @Socrates

Можете ли вы дать ссылку на него?, @Majenko

Что ж, ссылка «Подробнее» указывает на этот URL-адрес: https://github.com/adafruit/DHT-sensor-library., @Socrates

У меня отлично компилируется с этой библиотекой., @Majenko

Я не совсем понимаю, где я мог бы сделать ошибку. Я поместил весь свой код в «EDIT 1» в своем посте выше. Вы видите какую-либо ошибку в этом?, @Socrates

Вы должны включить библиотеку DHT.h в свой заголовок, чтобы он знал, что такое DHT., @Majenko

Вы сказали, что используете другую библиотеку для DHT. Который из них? Есть ли какая-то особая причина, по которой вы используете другую библиотеку для DHT?, @Socrates

У меня просто оказалась под рукой библиотека Grove, которая использует DHT.h в качестве имени заголовка, поэтому я просто использовал ее. Нет другой причины., @Majenko

Ладно, спасибо за информацию и за помощь!, @Socrates

Скажем, у меня была другая переменная, которую я хотел взять, т.е. DhtLib(int dhtPin, int AnotherVariable) : dht(dhtPin, DHT22) {}, как мне ее использовать? Определив private: int privateVariable; в DhtLibrary.h, я попробовал DhtLib(int dhtPin, int otherVariable) : dht(dhtPin, DHT22) {privateVariable = AnotherVariable}, но получаю сообщение об ошибке error: ' privateVariable' не был объявлен в этой области. Как я могу установить «privateVariable» с «anotherVariable»?, @Socrates

Обычно вы просто добавляете его в список инициализаторов: DhtLib(int dhtPin, int otherVariable) : dht(dhtPin, DHT22), privateVariable(anotherVariable) {}, @Majenko

Итак, для чего нужны фигурные скобки? Можно ли в них заложить логику?, @Socrates

Да, это просто пустое тело функции, в которое вы могли бы поместить код конструктора, если бы он вам когда-нибудь понадобится., @Majenko

У вас есть ссылка на описание этого конкретного синтаксиса?, @Socrates

https://en.cppreference.com/w/cpp/language/constructor, @Majenko

Большое спасибо! Вы здорово помогли!, @Socrates