Как правильно объявить члена класса, чтоб он была доступна в функции

papant
Offline
Зарегистрирован: 27.04.2016

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

Заранее благодарен за любую помощь )

rkit
Offline
Зарегистрирован: 23.11.2016

В global.h объявление. Все файлы, импортирующие этот файл, теперь знают, что такая переменная существует и как с ней работать.

#include "MyClasses.h"

extern myLight LightBathroom;

 

В любом cpp (global.cpp очевидно, можно в main.cpp, еще лучше main.h вместо global.h) физически выделяем память под и определяем значение переменной.

myLight LightBathroom();

papant
Offline
Зарегистрирован: 27.04.2016

rkit пишет:

В 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 надо писать без скобок ().