Куда идут файлы классов в проекте 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...
Куда попадают файлы .cpp и .hpp для ExecutionState, GoodState, BadState, UglyState, WeirdState и StateContainer? (Предположим, что я был бы склонен поместить их все в каталог с именем «executionstates» где-то в иерархии каталогов проекта, но я не уверен, где этот точный каталог должен находиться).
Какие #includes мне нужно поместить в ExecutionState, Good/Bad/Ugly/WeirdState и StateContainer... и они идут в файле .hpp или в файле .cpp для соответствующего класса?
Что нужно сделать, чтобы файл .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, каждый из которых представляет уникальное состояние выполнения.
@Bitbang3r, 👍1
Обсуждение2 ответа
С плагином Sloeber Eclipse файлы ino помещаются в корень проекта, а файлы cpp, c и h могут находиться в корне или во вложенных папках. пример:
Папки, созданные Sloeber: подпапка core
— это виртуальная папка со ссылками на основные файлы Arduino и файлы вариантов выбранной платы. Папка libraries
— виртуальная папка со ссылками на выбранные для проекта библиотеки. Папка Release
содержит сгенерированный make-файл, файлы .o и результирующие файлы elf, hex, bin. (И sloeber.ino.cpp — это файл, сгенерированный Sloeber)
Папки проекта: папка data
на картинке-примере является условным обозначением папки с файлами esp8266 SPIFFS. utility
— это подпапка с дополнительными исходными файлами проекта.
Я помещаю свои файлы классов, [class].cpp и [class].h, в ту же папку, что и мой файл project.ino, по крайней мере, во время разработки. Затем, если они достаточно общие, я перемещу их в [workspace]/libraries/[class]/ для будущего использования.
Но даже если они предназначены только для этого проекта (поэтому они могут оставаться в папке с исходным кодом проекта), будет хорошей организацией хранить их в отдельных файлах, поскольку по своей природе классы раскрывают только свои интерфейсы, а не их "внутренности".
- C++ против языка Arduino?
- Как использовать SPI на Arduino?
- Какие накладные расходы и другие соображения существуют при использовании структуры по сравнению с классом?
- Ошибка: expected unqualified-id before 'if'
- Что лучше использовать: #define или const int для констант?
- Функции со строковыми параметрами
- Библиотека DHT.h не импортируется
- ошибка: ожидаемое первичное выражение перед токеном ','
«Arduino» C++ автоматически генерирует файлы #include для вещей, которые он считает библиотеками». Arduino IDE, являясь инструментом обучения для новых программистов, действительно делает это, но это уникально для этой среды. уровень (Eclipse/Sloeber), который избавит вас от огромного количества утомительной работы, но не исправит ваш код за вас, будьте готовы писать соответствующий стандартам C++, даже если вы используете Arduino IDE. меньше возможностей для ошибок, лучше понять язык, и ваш код будет переносимым в среду, соответствующую стандартам., @JRobert