Una desventaja podría ser la falta de ocultación/encapsulación de la información.
Prefiero tener el archivo de encabezado más mínimo que pueda. Significa que no estoy obligado a continuar apoyando tantas funciones. Si quiero cambiar algo, y ese algo no se ha expuesto en el encabezado público, hay muchas más posibilidades de que pueda cambiarlo internamente a la clase sin afectar a nadie más.
EDIT:
Lucas pidió un ejemplo, así que aquí ya go:
Suponga que tiene una clase llamada Car
. Y, para lo único que lo construyó fue para pasar del punto A al punto B. Yo, personalmente, preferiría mantener mi archivo de encabezado en: una clase llamada Car
, y un método llamado Drive
. Por la forma en que formuló su pregunta ("todas las clases que puedo"), esperaría encontrar clases como "DieselEngine", "PetrolEngine", "HybidEngine" y tal en su archivo de encabezado también. El problema con esto es que otras personas que trabajan en su proyecto (o, usted, con el tiempo) comienzan a usar esas clases expuestas. Ahora, dos años después, decides "Hrm ... que la clase PetrolEngine realmente me está causando problemas. Creo que voy a eliminarla y reemplazarla por la HybridEngine por completo en mi clase de auto" - bueno, ahora PetrolEngine está incluido en otros 100 archivos por razones que no comprende, y ahora está obligado a mantener a PetrolEngine (y a trabajar como solía hacerlo) para todos los otros tipos que lo usaron en algunos de los que no está seguro. - porque no tenía un "contrato" sólido de trabajo para la forma en que quería que esa clase se utilizara en primer lugar. Fue un detalle de implementación de lo que realmente quería lograr: construir un automóvil.
EDIT para hablar sobre los comentarios acerca de la ocultación de información:
Si todo lo que estamos haciendo es estrictamente prospectivas declarando el nombre de clase/struct - bueno, supongo que me gustaría preguntar "por qué" de nuevo. Si soy un consumidor de su archivo de encabezado y clase (es), y realmente no puedo hacer nada con esa clase, y no está expuesto como un parámetro o tipo de retorno de la API de su clase principal, entonces ¿por qué exponerlo en absoluto? ?
Si lo está utilizando para el tiempo de compilación, compruebe las comprobaciones de seguridad de las estructuras de datos opacas, bueno, eso es una cosa. Pero, la forma en que redactó su pregunta me hizo sonar como todo entró en el archivo de encabezado como una cuestión de rutina.
¿Menos oportunidad de tomar café durante una construcción completa? –