Вызов члена класса из файла .h

В файле .ino у меня есть определенный класс (называемый IPmonitoring).Кроме того, внутри того же файла .ino я вызываю файл .h ( который находится "выше" класса IPmonotoring).

Когда я пытаюсь вызвать членов IPmonitoring внутри файла .h - я получаю ошибку, которую обычно решаю с помощью extern, но, похоже, это не то же самое для классов.

Что же делать ?

Парень

, 👍1

Обсуждение

в этом случае определение класса не включается в файл .h. Поэтому обычно вы определяете этот класс в другом файле .h, а затем позволяете первому файлу .h включать второй файл .h с определением класса., @chrisl

Я не знаю, что вы подразумеваете под "вызовом файла.h". Вы имеете в виду " #включить` это?, @timemage

У вас не должно быть кода в файле .h, если он не является "встроенным" или шаблонным классом., @Majenko

@timemage - да, @Guy . D


1 ответ


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

2

Вам нужно заново продумать свой макет и использование файла .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