Вызов члена класса из файла .h
В файле .ino у меня есть определенный класс (называемый
IPmonitoring
).Кроме того, внутри того же файла .ino
я вызываю файл .h
( который находится "выше" класса IPmonotoring
).
Когда я пытаюсь вызвать членов IPmonitoring
внутри файла .h - я получаю ошибку, которую обычно решаю с помощью extern
, но, похоже, это не то же самое для классов.
Что же делать ?
Парень
@Guy . D, 👍1
Обсуждение1 ответ
Лучший ответ:
Вам нужно заново продумать свой макет и использование файла .h.
- Вы никогда не должны иметь код в файле .h, если он не является
встроенным
или частьюкласса шаблона.
Файл .h должен содержать только подсказки о том, где находятся другие вещи. Тогда эти вещи должны быть в файлах .cpp или .ino.
Например, ваш класс IPmonitoring будет объявлен в файле .h и определен (или реализован) в файле .cpp (или .ino, если вы предпочитаете). В любом месте, где вы хотите использовать этот класс, вы #включаете
файл .h. В одном месте вы можете создать экземпляр этого класса. Именно на этот экземпляр вы затем ссылаетесь с помощью extern
.
В мире Arduino принято создавать один экземпляр класса в файле .cpp класса и выводить
его в файл .h, так что везде, где вы включаете файл .h, мгновенно появляется доступ к этому единственному экземпляру объекта.
Именно так пишется большинство библиотек.
Например:
// IPMonitoring.h
class IPMonitoring {
public:
void doStuff();
};
extern IPMonitoring ipMon;
И еще:
// IPMonitoring.cpp
#include <IPMonitoring.h>
IPMonitoring ipMon;
void IPMonitoring::doStuff() {
// Do something
}
И наконец:
// mySketch.ino
#include <IPMonitoring.h>
void setup() {
ipMon.doSomething();
}
void loop() {
}
шаблоны классов создаются для создания классов; аналогично для шаблонов функций и функций. Использование шаблона не влияет ни на что, кроме того, что является *стимулом* для внедрения, так как ключевое слово export никогда по-настоящему не срабатывало, а затем было позже удалено из стандарта., @timemage
Мадженко -Спасибо. Все начиналось как файл. ino с функциями. Во время написания кода я собрал всю функцию в класс, так как мне нужно было 3 ее экземпляра. А в файле". h " собраны все функции, которые я использовал для своего Wi-Fi, и MQTT другого класса, которым я постоянно пользуюсь... что ж, дело начало становиться запутанным :), @Guy . D
- Какие накладные расходы и другие соображения существуют при использовании структуры по сравнению с классом?
- Ошибка: "недопустимое использование нестатической функции-члена" при вызове функции из моего собственного класса-метода
- Массив динамического размера в качестве члена класса
- Как перебрать объекты или передать объект функции?
- C++ Undefined reference to 'Class:Function()'
- Прерывания внутри класса, связанные с функцией класса
- Присоедините функцию Arduino ISR к члену класса
- Недопустимое использование нестатической функции-члена
в этом случае определение класса не включается в файл .h. Поэтому обычно вы определяете этот класс в другом файле .h, а затем позволяете первому файлу .h включать второй файл .h с определением класса., @chrisl
Я не знаю, что вы подразумеваете под "вызовом файла.h". Вы имеете в виду " #включить` это?, @timemage
У вас не должно быть кода в файле .h, если он не является "встроенным" или шаблонным классом., @Majenko
@timemage - да, @Guy . D