Куда идут файлы классов в проекте Sloeber Eclipse?

Я пытаюсь создать новый проект Arduino с помощью Sloeber (Eclipse). Предположим, что это только что созданный проект, основным файлом которого является ".\ArduinoMainClass.ino"

Теперь... предположим, я хочу создать полдюжины новых классов:

  • ExecutionState – класс C++, функционально эквивалентный интерфейсу Java. Если вам интересно, я пытаюсь реализовать шаблон "Состояние".

  • GoodState, BadState, UglyState, WeirdState — классы C++, расширяющие ExecutionState. Если бы они были Java, они бы технически реализовывали интерфейс... но поскольку это C++, и я все еще делаю маленькие шаги, на данный момент ExecutionState - это просто класс с одним методом, который ничего не делает, и все ЭТИ классы переопределяют это для выполнения реальной работы.

  • StateContainer – класс C++, единственное предназначение которого – хранить отдельные экземпляры GoodState, BadState, UglyState и WeirdState. Если бы это была Java, они были бы синглтонами... В GoodState (и других) было бы что-то вроде:

    private static ExecutionState instance = new GoodState();
    // ...
    public static ExecutionState getInstance() { return instance; }

... но это явно не Java, и я еще далеко не настолько знаком с C++, чтобы правильно реализовать статические синглтоны, так что пока я просто собираюсь создать экземпляр StateContainer для создания и хранения этих единичные экземпляры.

Итак... Теперь у меня загружен Sloeber/Eclipse, и я создал свой проект. Если бы это была Java, я бы создал подкаталог наподобие .\src\java\com\packagename\executionstate и поместил в него файлы .cpp и .hpp для ExecutionState, GoodState, BadState, UglyState, WeirdState и StateContainer и добавил «включить в него com.packagename.executionstate.*».

  • Я знаю, что пространства имен C++ не имеют прямой связи с именами каталогов
  • У меня сложилось впечатление, что C++ типа "Arduino" автоматически генерирует файлы #include для вещей, которые он считает библиотеками. У меня есть подозрение, что я, вероятно, хочу поместить все классы, упомянутые выше, в какой-нибудь каталог и представить их в IDE как «библиотеку» Arduino, чтобы все они были неявно включены за один раз в файле .ino.
  • Я совершенно не понимаю, что мне нужно #include в упомянутых выше классах, чтобы они могли взаимно находить друг друга... и правильно ли эти #include принадлежат файлам .hpp или .cpp.

Итак... вернемся к общей картине. Если мой проект находится в c:\users\moi\Documents\Slober-workspace\FirstSloeberArduinoApp...

  1. Куда попадают файлы .cpp и .hpp для ExecutionState, GoodState, BadState, UglyState, WeirdState и StateContainer? (Предположим, что я был бы склонен поместить их все в каталог с именем «executionstates» где-то в иерархии каталогов проекта, но я не уверен, где этот точный каталог должен находиться).

  2. Какие #includes мне нужно поместить в ExecutionState, Good/Bad/Ugly/WeirdState и StateContainer... и они идут в файле .hpp или в файле .cpp для соответствующего класса?

  3. Что нужно сделать, чтобы файл .ino мог найти StateContainer?

Если вы совсем запутались, мой реальный файл .ino будет выглядеть примерно так:

void setup() {
    // executeStates — это глобальная переменная, объявленная выше
    executionStates = new StateContainer();
    executionState = executionStates.getGoodState();
    // Конструктор StateContainer сам создает экземпляры различных подклассов ExecutionState,
   // и передает ссылки на себя своим конструкторам, чтобы они могли
   // получить ссылки на другие состояния, поскольку они должны их вернуть.
}

void loop() {
    executionState = executionState->doSomething();
    /* executionState holds a pointer to an instance of an ExecutionState subclass.
       Each time doSomething() executes, it returns a pointer to its new state
     */
}

... и на самом деле будут десятки подклассов ExecutionState, каждый из которых представляет уникальное состояние выполнения.

, 👍1

Обсуждение

«Arduino» C++ автоматически генерирует файлы #include для вещей, которые он считает библиотеками». Arduino IDE, являясь инструментом обучения для новых программистов, действительно делает это, но это уникально для этой среды. уровень (Eclipse/Sloeber), который избавит вас от огромного количества утомительной работы, но не исправит ваш код за вас, будьте готовы писать соответствующий стандартам C++, даже если вы используете Arduino IDE. меньше возможностей для ошибок, лучше понять язык, и ваш код будет переносимым в среду, соответствующую стандартам., @JRobert


2 ответа


1

С плагином Sloeber Eclipse файлы ino помещаются в корень проекта, а файлы cpp, c и h могут находиться в корне или во вложенных папках. пример:

Папки, созданные Sloeber: подпапка core — это виртуальная папка со ссылками на основные файлы Arduino и файлы вариантов выбранной платы. Папка libraries — виртуальная папка со ссылками на выбранные для проекта библиотеки. Папка Release содержит сгенерированный make-файл, файлы .o и результирующие файлы elf, hex, bin. (И sloeber.ino.cpp — это файл, сгенерированный Sloeber)

Папки проекта: папка data на картинке-примере является условным обозначением папки с файлами esp8266 SPIFFS. utility — это подпапка с дополнительными исходными файлами проекта.

,

0

Я помещаю свои файлы классов, [class].cpp и [class].h, в ту же папку, что и мой файл project.ino, по крайней мере, во время разработки. Затем, если они достаточно общие, я перемещу их в [workspace]/libraries/[class]/ для будущего использования.

Но даже если они предназначены только для этого проекта (поэтому они могут оставаться в папке с исходным кодом проекта), будет хорошей организацией хранить их в отдельных файлах, поскольку по своей природе классы раскрывают только свои интерфейсы, а не их "внутренности".

,