No tengo experiencia previa con C ++ o C, pero sé cómo programar C # y estoy aprendiendo Arduino. Solo quiero organizar mis bocetos y estoy bastante cómodo con el lenguaje Arduino incluso con sus limitaciones, pero realmente me gustaría tener un enfoque orientado a objetos para mi programación Arduino.
Entonces, he visto que puede tener las siguientes formas (no una lista exhaustiva) para organizar el código:
- Un solo archivo .ino;
- Múltiples archivos .ino en la misma carpeta (lo que el IDE llama y muestra como "pestañas");
- Un archivo .ino con un archivo .h y .cpp incluido en la misma carpeta;
- Igual que el anterior, pero los archivos son una biblioteca instalada dentro de la carpeta del programa Arduino.
También he oído hablar de las siguientes formas, pero todavía no las tengo funcionando:
- Declarar una clase de estilo C ++ en el mismo archivo .ino único (he oído hablar de él, pero nunca lo he visto funcionar, ¿es eso posible?);
- [enfoque preferido] Incluyendo un archivo .cpp donde se declara una clase, pero sin usar un archivo .h (quisiera este enfoque, ¿debería funcionar?);
Tenga en cuenta que solo quiero usar clases para que el código esté más particionado, mis aplicaciones deben ser muy simples, solo con botones, leds y zumbadores en su mayoría.
programming
c++
class
heltonbiker
fuente
fuente

Respuestas:
Cómo organiza las cosas el IDE
Primero, así es como el IDE organiza su "boceto":
.inoarchivo principal tiene el mismo nombre que la carpeta en la que se encuentra. Por lo tanto,foobar.inoen lafoobarcarpeta, el archivo principal es foobar.ino..inoarchivos de esa carpeta se concatenan juntos, en orden alfabético, al final del archivo principal (independientemente de dónde esté el archivo principal, alfabéticamente)..cpparchivo (p. Ej.foobar.cpp), Se coloca en una carpeta de compilación temporal.#include <libraryname>directivas. Esto activa el IDE para copiar también todos los archivos relevantes de cada biblioteca (mencionada) en la carpeta temporal y generar instrucciones para compilarlos..c,.cppo los.asmarchivos en la carpeta de croquis se agregan al proceso de compilación como unidades de compilación separadas (es decir, se compilan de la manera habitual como archivos separados).harchivos también se copian en la carpeta de compilación temporal, por lo que sus archivos .c o .cpp pueden consultarlos.main.cpp)strcpyetc.)Un efecto secundario de todo esto es que puede considerar que el boceto principal (los archivos .ino) es C ++ a todos los efectos. Sin embargo, la generación del prototipo de la función puede generar mensajes de error oscuros si no tiene cuidado.
Evitar las peculiaridades del preprocesador
La forma más sencilla de evitar estas idiosincrasias es dejar su boceto principal en blanco (y no usar ningún otro
.inoarchivo). Luego crea otra pestaña (un.cpparchivo) y coloca tus cosas en ella de esta manera:Tenga en cuenta que debe incluir
Arduino.h. El IDE lo hace automáticamente para el boceto principal, pero para otras unidades de compilación, debe hacerlo. De lo contrario, no sabrá cosas como String, los registros de hardware, etc.Evitar la configuración / paradigma principal
No tiene que ejecutar con el concepto de configuración / bucle. Por ejemplo, su archivo .cpp puede ser:
Forzar inclusión de biblioteca
Si ejecuta con el concepto de "boceto vacío" aún necesita incluir bibliotecas utilizadas en otros lugares del proyecto, por ejemplo, en su
.inoarchivo principal :Esto se debe a que el IDE solo escanea el archivo principal para el uso de la biblioteca. Efectivamente, puede considerar el archivo principal como un archivo de "proyecto" que designa qué bibliotecas externas están en uso.
Problemas de nombres
No nombre su boceto principal "main.cpp": el IDE incluye su propio main.cpp, por lo que tendrá un duplicado si lo hace.
No asigne un nombre a su archivo .cpp con el mismo nombre que su archivo .ino principal. Dado que el archivo .ino se convierte efectivamente en un archivo .cpp, esto también le daría un choque de nombres.
Sí, esto compila OK:
Sin embargo, probablemente sea mejor que siga la práctica normal: coloque sus declaraciones en
.harchivos y sus definiciones (implementaciones) en.cpp(o.c) archivos.¿Por qué "probablemente"?
Como muestra mi ejemplo, puedes juntar todo en un solo archivo. Para proyectos más grandes es mejor estar más organizado. Finalmente, llega al escenario en un proyecto de tamaño mediano a grande donde desea separar las cosas en "cajas negras", es decir, una clase que hace una cosa, lo hace bien, se prueba y es autónoma ( tan lejos como sea posible).
Si esta clase se usa en varios otros archivos en su proyecto, aquí es donde entran en juego los archivos separados
.hy.cpp.El
.harchivo declara la clase, es decir, proporciona detalles suficientes para que otros archivos sepan qué hace, qué funciones tiene y cómo se llaman.El
.cpparchivo define (implementa) la clase, es decir, en realidad proporciona las funciones y los miembros de clase estáticos que hacen que la clase haga lo suyo. Como solo desea implementarlo una vez, esto está en un archivo separado.El
.harchivo es lo que se incluye en otros archivos. El.cppIDE compila el archivo una vez para implementar las funciones de clase.Bibliotecas
Si sigue este paradigma, entonces está listo para mover toda la clase (los archivos
.hy.cpp) a una biblioteca muy fácilmente. Luego se puede compartir entre múltiples proyectos. Todo lo que se requiere es hacer una carpeta (p. Ej.myLibrary) Y poner los archivos.hy.cppen ella (p. Ej.myLibrary.hYmyLibrary.cpp) y luego poner esta carpeta dentro de sulibrariescarpeta en la carpeta donde se guardan sus bocetos (la carpeta del cuaderno de bocetos).Reinicie el IDE y ahora sabe sobre esta biblioteca. Esto es realmente trivialmente simple, y ahora puede compartir esta biblioteca en múltiples proyectos. Lo hago mucho.
Un poco más de detalle aquí .
fuente
Mi consejo es mantener la forma típica de hacer las cosas en C ++: interfaz separada e implementación en archivos .h y .cpp para cada clase.
Hay algunas capturas:
O bien, puede deshacerse del Arduino IDE e intentar con Eclipse . Como mencioné, algunas de las cosas que se supone que ayudan a los principiantes, tienden a interponerse en el camino de los desarrolladores más experimentados.
fuente
Estoy publicando una respuesta solo para completar, después de descubrir y probar una forma de declarar e implementar una clase en el mismo archivo .cpp, sin usar un encabezado. Entonces, con respecto a la formulación exacta de mi pregunta "cuántos tipos de archivos necesito para usar las clases", la respuesta actual usa dos archivos: uno .ino con un archivo include, setup y loop, y el .cpp que contiene el conjunto (bastante minimalista ) clase, que representa las señales de giro de un vehículo de juguete.
Blinker.ino
TurnSignals.cpp
fuente