Куда идут файлы классов в проекте 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