Создать экземпляр класса в конструкторе, а не над 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;
@Socrates, 👍0
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();
}
- Данные DHT11 из Arduino UNO в Firebase через ESP8266
- Объяснение кода MPU6050
- Как я могу прервать задержку() при нажатии кнопки?
- Проблема с открытием нескольких текстовых файлов одновременно/по порядку с использованием <SD.h>
- Как остановить серводвигатель в текущем положении при использовании последовательного порта? Я хочу, чтобы он оставался в одном положении при получении «0».
- Как установить управляющий регистр в модуле RTC DS3231 для Arduino UNO R3?
- Как повторить другое действие внутри цикла?
- Клиент веб-сокета Arduino CC3000
Спасибо за быстрый ответ! Не могли бы вы уточнить часть
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