¿Por qué incluir el .cpp es una gitanada? (C++)

Buenas compañeros.
Normalmente en la uni a la hora de programar nos obligan a separar el contenido del programa en 3 ficheros.
El header, el codigo de las clases en el .cpp y el main.
Un amigo preguntó el otro dia. ¿Por qué en vez de incluir el .hpp en el .cpp y el main y compilar del tipo gcc .cpp main.cpp -o ejecutable, hacemos un include del .cpp en el main y solo compilamos con g++ main.cpp -o ejecutable?
El profesor dijo que eso era una gitanada y ya está.
Y a mi sinceramente me gustaría saber el motivo de esto, espero que se entienda. Un saludo.
Pregunta al profesor, que es él quién te está formando, no? [oki]
alexricoj escribió:Pregunta al profesor, que es él quién te está formando, no? [oki]


Se intentó, pero no nos aclaró la duda y dió el tema por zanjado, por eso he recurrido a esto. Lo máximo que he visto son aclaraciones de como compilar y ya está.
Para programar hay que seguir unas pautas de limpieza. Si pones todo junto y apelotonado, igual tu ahora entiendes el código, pero otra persona que lo quiera ver probablemente le cueste bastante más trabajo del que debería. E incluso tu mismo si quieres volver a retomar ese código años más tarde de costará más entenderlo.
También a parte puedes hacer una clase con ciertas utilidades que le puedan interesar a otra persona. Esa persona puede que no quiera saber como esa clase está programada por debajo, así que lo tiene tan fácil como abrir sólo el archivo .h y ahí leer lo que hace cada método que hayas hecho para esa clase, como invocarla y demás. Y por supuesto si esa persona quiere utilizar tu clase, no quiere para nada un programa con su main y tal, sólo la clase.

En resumen, limpieza.
Acermax escribió:Para programar hay que seguir unas pautas de limpieza. Si pones todo junto y apelotonado, igual tu ahora entiendes el código, pero otra persona que lo quiera ver probablemente le cueste bastante más trabajo del que debería. E incluso tu mismo si quieres volver a retomar ese código años más tarde de costará más entenderlo.
También a parte puedes hacer una clase con ciertas utilidades que le puedan interesar a otra persona. Esa persona puede que no quiera saber como esa clase está programada por debajo, así que lo tiene tan fácil como abrir sólo el archivo .h y ahí leer lo que hace cada método que hayas hecho para esa clase, como invocarla y demás. Y por supuesto si esa persona quiere utilizar tu clase, no quiere para nada un programa con su main y tal, sólo la clase.

En resumen, limpieza.


No, no, no me has entendido Básicamente ahora hacemos esta estructura, por ejemplo con el programa cadena.
Tenemos el cadena.h, el cadena.cpp y el main.cpp
Tanto el cadena.cpp como el main.cpp tienen al principio #include "cadena.h". Y compilamos de esta forma:
g++ cadena.cpp main.cpp -o cadena

Lo que mi compañero dijo es que en en vez de tener #include "cadena.h" en ambas, por qué no hacerlo asi:
cadena.cpp
#include "cadena.h"
main.cpp
#include "cadena.cpp"
De esta forma al compilar solo habría que hacer:
g++ main.cpp -o cadena

Pero dijo que era una gitanada y no entendemos el por qué.
Pues porque no tiene mucho sentido incluir el .cpp de una clase. Se ha de incluir el .h

Tu no tienes porque tener el .cpp de una clase, no tienen porque dártelo, de hecho piénsalo, en la clase "vector" que imagino que usaréis, o "iostream" tu no tienes el .cpp, no podrías incluirlos nunca. Cuando alguien te da una clase puede ser que sólo te incluyan el .h y el código precompilado.
Acermax escribió:Pues porque no tiene mucho sentido incluir el .cpp de una clase. Se ha de incluir el .h

Tu no tienes porque tener el .cpp de una clase, no tienen porque dártelo, de hecho piénsalo, en la clase "vector" que imagino que usaréis, o "iostream" tu no tienes el .cpp, no podrías incluirlos nunca. Cuando alguien te da una clase puede ser que sólo te incluyan el .h y el código precompilado.


Vale compañero, muchísimas gracias ahora si que me queda claro!!
Y tema aparte, no podemos llamar ni profesor ni maestro a quien te esta enseñando y se niega a dar una explicacion, sencilla y sin molestarse, de algo que le han preguntado.
La compilación en C/C++ por lo general consta de 3 pasos:

1. Preprocesado
2. Compilado
3. Linkado

El preprocesador se encarga de incluir los includes y procesar las macros. El compilador no ve header file ninguno, si no que lo trata todo como una sola unidad de compilación.

O sea, que incluir un cpp, es simplemente como tener todo el código en el mismo fichero. No es útil, no es ordenado, y puede ser hasta más lento: en caso de realizar cambios tendrías que volver a recompilar la misma unidad de compilación, en lugar de compilar solo las partes necesarias.

Ah, y decidle a vuestro profesor que os enseñe a usar 'make' ;)
Iknewthat escribió:La compilación en C/C++ por lo general consta de 3 pasos:

1. Preprocesado
2. Compilado
3. Linkado

El preprocesador se encarga de incluir los includes y procesar las macros. El compilador no ve header file ninguno, si no que lo trata todo como una sola unidad de compilación.

O sea, que incluir un cpp, es simplemente como tener todo el código en el mismo fichero. No es útil, no es ordenado, y puede ser hasta más lento: en caso de realizar cambios tendrías que volver a recompilar la misma unidad de compilación, en lugar de compilar solo las partes necesarias.

Ah, y decidle a vuestro profesor que os enseñe a usar 'make' ;)


Buen repaso me has hecho de sistemas operativos, muchas gracias compañero!!
De hecho en esa asignatura utilizamos el cmake, pero no lo han vuelto a nombrar (he de admitir que a pesar de que la primera vez iba lento, después daba gusto).
Muchísimas gracias de nuevo!
9 respuestas