Pregunta

Algunas clases, como excepciones o plantillas, solo necesitan el archivo de encabezado (.h), a menudo no hay .cpp relacionado con ellas.

He visto algunos proyectos donde (para algunas clases) no hay archivos .cpp asociados a los archivos de encabezados, tal vez porque la implementación es tan corta que se realiza directamente en .h, o tal vez por otras razones , como las clases de plantilla, donde es obligatorio incluir la implementación en el encabezado.

¿Cuál es su opinión, si una clase es demasiado corta, debería evitar crear un archivo .cpp y escribir el código directamente en el archivo de encabezado? Si el código está escrito en el archivo de encabezado, ¿debo incluir un .cpp vacío para que los archivos del proyecto sigan siendo coherentes?

¿Fue útil?

Solución

No agregaría archivos .cpp innecesarios. Cada archivo .cpp que agregue debe compilarse, lo que ralentiza el proceso de compilación.

En general, el uso de su clase solo requerirá el archivo de encabezado de todos modos: no veo ninguna ventaja para un " vacío " .cpp para mantener la coherencia en el proyecto.

Otros consejos

No. Si no hay nada que deba estar en el .cpp, no necesita uno.

Hay una ventaja de crear siempre un .cpp para cada .h, incluso cuando el primero esté vacío: impone en el momento de la compilación que los archivos de encabezado sean independientes. Esto está relacionado con la guía de incluir foo.h primero en foo.cpp :

  

Con el orden preferido, si dir2 / foo2.h omite cualquier inclusión necesaria, la compilación de dir / foo.cpp se interrumpirá. Por lo tanto, esta regla garantiza que los saltos de compilación se muestren primero para las personas que trabajan en estos archivos, no para las personas inocentes en otros paquetes.

Realmente son caballos para los cursos:

  • Clases de solo encabezado: por ejemplo, plantilla clases
  • Encabezado y cpp: separa la declaración desde la implementación.
  • solo cpp: su main () puede vivir en uno de estos.

El código fuente del archivo de encabezado es a veces la única forma de escribir plantillas reutilizables. Consulte boost para ver muchos ejemplos de esto.

Encabezado y cpp es más 'normal'. Separa la declaración de la implementación y puede acelerar la compilación cuando el compilador no tiene que leer muchas veces las implementaciones. Es posible que desee comenzar aquí y luego ver cómo funciona la implementación y si el archivo cpp se vacía, puede eliminarlo.
Otro punto aquí es que tendrá su #include " foo.h " en la parte superior de foo.cpp para demostrar que cualquier otra persona puede hacer esto y no tener un compilador errores.

Cpp solo archivos. main () puede vivir aquí, y he puesto clases de prueba cppUnit en archivos como este.

Regla general, mantenga la clase relacionada en el mismo archivo. Las clases principalmente diferentes deben colocarse en sus propios archivos .hpp y .cpp. La razón de esto es que en proyectos grandes tienes hasta 10,000 clases y poner esa cantidad de archivos enfrente del usuario y el IDE normalmente hace que las cosas se rompan.

Hay bibliotecas muy útiles y exitosas, como muchas en boost , que son solo encabezado.

Si algunas clases son cortas y parecen estar en línea, tiendo a juntarlas todas en types.h , el único encabezado que no considero que merezca un archivo .cpp.

Sin embargo, la mayoría de las clases superan tanto la posibilidad de entrar solo en el encabezado como la posibilidad de entrar en types.h .

Algunos ejemplos de lo que hago. Considero que la clase para la implementación del vector tridimensional Vector3 merece su .h y .cpp, a pesar de ser simple. Pero Position realmente no merece eso; después de todo, incluso sería un P.O.D. estructura, si no fuera por ese molesto getDistance () que me gusta implementado allí.

Entonces no, no todas las clases merecen sus archivos .cpp y .h. Pero la mayoría lo hace, y aquellos que definitivamente no se ponen de pie en un encabezado solitario. Si son tan cortos para encajar solo en el encabezado, se acurrucan junto con otras clases cortas o van al encabezado de la clase con la que están estrechamente relacionados.

Mi regla de oro es que cualquier método que necesite más de una línea de código para expresar entra en un archivo .cpp .

Para una discusión más detallada sobre este tema, puede consultar esta antigua pregunta mía: Código C ++ en archivos de encabezado . No creo que su pregunta sea un duplicado exacto, pero está lo suficientemente cerca como para que deba leerla.

Consulte también esta pregunta : los archivos de encabezado solo deben ser para declaraciones.

Si tiene código compilable incluido en varios lugares (a partir de su comentario: "¿podría evitar crear un archivo .cpp y escribir el código directamente en el archivo de encabezado?"), se compilará cada vez (aunque usted podría tener encabezados precompilados) y el vinculador resolverá (o no) el código de objeto hinchado.

El hecho de que la definición de clase sea pequeña no significa que deba estar en el archivo de encabezado a menos que la definición también sea la misma que la declaración, p. una clase virtual pura o un tipo simple como se menciona en la otra respuesta.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top