Как правильно объявить члена класса, чтоб он была доступна в функции
- Войдите на сайт для отправки комментариев
Добрый вечер. В программировании силен на уровне - ctrl+c, ctrl+v примеров из гугля.
Пишу код для ЕСП32 в VisualStudioCode, проект разбит на несколько файлов.
Задачи:
1) научиться правильно объявлять член класса в проекте
2) присвоить члену класса значение внутри функции
Есть файлы:
1)main.cpp
#include "Global.h" #include "MyClasses.h" //создадим член класса myLight LightBathroom(); void mysensors ( ) { //что-то делаем с членом класса LightBathroom.setGerkonState(b_gerkon); bool b_btn=!myBTN.read(); LightBathroom.setBtnState(b_btn); bool pir= MotionDetect ( digitalRead(PIR_PIN) ); LightBathroom.setPirState(pir); }
2) Заголовочный файл MyClasses.h с соответствующим ему файлом .срр с содержимым:
#ifndef MY_CLASSES #define MY_CLASSES #include "Global.h" class myLight { // содержимое класса } #endif
3) заголовочный файл MqttClient.h с соответствующим ему файлом .cpp с содержимым:
#include "Global.h" #include "MyClasses.h" //различные процедуры void mqttCallback(char* topic, uint8_t* payload, size_t length) { //тут что-то делаем //Вот тут ошибка, что LightBathroom не объявлен LightBathroom.setLightState (0); }
4) заголовочный файл Global.h с соответствующим ему файлом .cpp с содержимым:
#ifndef _GLOBAL_H_ #define _GLOBAL_H_ // различные переменные #endif
Собственно вопросы:
1) как правильно объявить член класса LightBathroom? пробовал и в Global.h, Global.cpp, в файлы MqttClient.h и MqttClient.cpp (при этом ругается на необъявленный LightBathroom в файле main.cpp)
2) Наверняка неправильно изменять значение члена класса внутри функции Callback файла MqttClient. Что-то я делаю не так, т.к. не могу достучаться в ней до LightBathroom
Читал всяких статей, в том числе про указатели, мало что понял, но есть версия, что в Callback обращаться к члену класса LightBathroom надо именно так, но так как я ничего не понял, то туплю второй день...
Заранее благодарен за любую помощь )
В global.h объявление. Все файлы, импортирующие этот файл, теперь знают, что такая переменная существует и как с ней работать.
#include "MyClasses.h"
extern myLight LightBathroom;
В любом cpp (global.cpp очевидно, можно в main.cpp, еще лучше main.h вместо global.h) физически выделяем память под и определяем значение переменной.
myLight LightBathroom();
В global.h объявление. Все файлы, импортирующие этот файл, теперь знают, что такая переменная существует и как с ней работать.
#include "MyClasses.h"
extern myLight LightBathroom;
В любом cpp (global.cpp очевидно, можно в main.cpp, еще лучше main.h вместо global.h) физически выделяем память под и определяем значение переменной.
myLight LightBathroom();
УРААА, заработало! Спасибо большое!
Я примерно так же делал, только в global.h писал extern myLight LightBathroom(); т.е. со скобками, в main.cpp объявлял myLight LightBathroom(); и оно ругалось что происходит переобъявление переменной, и никак до меня не доходило, что в global.h надо писать без скобок ().