Скетч с несколькими классами (.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;

Почему это так? Любая помощь очень ценится.

, 👍1


1 ответ


Лучший ответ:

0

В RemoteDisplay.cc вы используете Remote в методе Initiate.

Кроме того, поскольку вы используете свойство напряжения, вам необходимо включить «Remote.h» (обычно в первую строку) в RemoteDisplay.cpp.

Также рекомендуется использовать в каждом заголовочном файле следующий шаблон (пример для RemoteDisplay.h):

#ifndef REMOTE_DISPLAY_H
#define REMOTE_DISPLAY_H
...
...
#endif // REMOTE_DISPLAY_H

Это предотвращает проблемы, связанные с тем, что два включаемых файла заголовка навсегда включают друг друга.

,

Понимаю. Спасибо! Это был #inlcude "Remote.h" в классе отображения, который сделал свое дело. И да, хорошая идея с #ifndef и т. д., @Emil Jacobsen

Удачи в вашем проекте (и здорово, что вы стараетесь поддерживать порядок в своем программном обеспечении)., @Michel Keijzers