C++ tiene algo llamado la regla de una sola definición. Significa que (excluyendo las funciones en línea), las definiciones solo pueden aparecer en una unidad de compilación. Dado que los archivos de encabezado de C++ son simplemente "copiar y pegar" en cada archivo de inclusión, ahora está poniendo definiciones en varios lugares si solo pone las definiciones en los archivos de encabezado.
Por supuesto, usted puede decir, ¿por qué no hacer todo en línea. Bueno, si el compilador respeta su sugerencia en línea, el código para las funciones largas se replicará en cada sitio de llamadas, lo que hará que su código sea excesivamente grande y posiblemente cause molestias, problemas de caché y todo tipo de cosas no comprometidas.
Por otro lado, si el compilador no lo escucha, y no alinea nada, ahora tiene 2 problemas: 1) usted no sabe qué unidad de traducción obtuvo las definiciones de sus clases, y 2) el el compilador todavía tiene que pasar por sus definiciones cada vez que #incluye. Además, no hay una manera fácil de asegurarse de no haber definido accidentalmente el mismo método dos veces, en 2 encabezados diferentes, de manera diferente.
También obtiene un problema de dependencia circular. Para que una clase invoque el método de otra clase, esa clase debe declararse primero. Entonces, si 2 clases necesitan invocar los métodos de cada una, cada una debe declararse antes de que se pueda definir cualquiera de ellas. No hay forma de hacer esto con declaraciones y definiciones en un archivo.
Realmente, así es como se construyeron el lenguaje y el analizador. Es un dolor, pero solo tienes que lidiar con eso.
Me refiero a poner toda la definición de clase en .h e incluirla, mientras lo protejo con guardias de encabezado –
¿qué sucede si incluye ese archivo .h en más de un lugar en el mismo ejecutable? Resp: terminas con múltiples definiciones de las mismas funciones. - El verdadero punto aquí es que puedes hacer todo tipo de cosas tontas con las reglas, pero casi siempre resultan no funcionar tan bien en la práctica como en las formas normales. –