Как правильно объявить члена класса, чтоб он была доступна в функции
- Войдите на сайт для отправки комментариев
Добрый вечер. В программировании силен на уровне - 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 надо писать без скобок ().