Скетч с несколькими классами (.h и .cpp) – как соединить классы
Я хотел переместить большую часть функциональности моего скетча в разные классы, чтобы все было лучше организовано. Один класс работал нормально, но когда мне пришлось использовать несколько классов и передавать информацию между ними, все перестало работать.
У меня есть два класса: основной класс Remote и класс RemoteDisplay. Основной класс занимается измерением напряжения батареи, и я хочу отобразить это через класс RemoteDisplay. Для этого я инициирую класс Display с указателем на класс Remote, чтобы получить доступ к функции напряжения. Однако это не работает, хотя я объявляю класс Remote в классе Display.
Remote.ino
#include "Remote.h"
Remote Remote;
void setup() {
Serial.begin(9600);
}
void loop() {
Remote.display.showBattery();
}
Remote.h
#include "RemoteDisplay.h"
class Remote
{
public:
RemoteDisplay display;
Remote( void );
float voltage;
};
Remote.cpp
#include "Remote.h"
Remote::Remote(void)
{
display.initiate(this);
}
RemoteDisplay.h
class Remote;
class RemoteDisplay
{
public:
RemoteDisplay(void);
void initiate( Remote * _pointer );
void showBattery( void );
private:
/* Reference to the remote class */
Remote * pointer;
};
RemoteDisplay.cpp
#include "RemoteDisplay.h"
void RemoteDisplay::initiate( Remote * _pointer )
{
pointer = _pointer;
}
void RemoteDisplay::showBattery( void )
{
Serial.println( pointer->voltage );
}
Я получаю ошибки:
error: invalid use of incomplete type 'class Remote'
showBattery( pointer->voltage() );
note: forward declaration of 'class Remote'
class Remote;
Почему это так? Любая помощь очень ценится.
@Emil Jacobsen, 👍1
1 ответ
Лучший ответ:
В RemoteDisplay.cc вы используете Remote в методе Initiate.
Кроме того, поскольку вы используете свойство напряжения, вам необходимо включить «Remote.h» (обычно в первую строку) в RemoteDisplay.cpp.
Также рекомендуется использовать в каждом заголовочном файле следующий шаблон (пример для RemoteDisplay.h):
#ifndef REMOTE_DISPLAY_H
#define REMOTE_DISPLAY_H
...
...
#endif // REMOTE_DISPLAY_H
Это предотвращает проблемы, связанные с тем, что два включаемых файла заголовка навсегда включают друг друга.
- Передача двумерного массива в функцию
- Как работают массивы?
- Как передать объект Encoder конструктору другого класса
- Сбой при использовании переменных ссылок в классах
- Возникла проблема с доступом к значениям из указателя
- Какие накладные расходы и другие соображения существуют при использовании структуры по сравнению с классом?
- Ошибка: "недопустимое использование нестатической функции-члена" при вызове функции из моего собственного класса-метода
- Массив динамического размера в качестве члена класса
Понимаю. Спасибо! Это был #inlcude "Remote.h" в классе отображения, который сделал свое дело. И да, хорошая идея с #ifndef и т. д., @Emil Jacobsen
Удачи в вашем проекте (и здорово, что вы стараетесь поддерживать порядок в своем программном обеспечении)., @Michel Keijzers