Las variables privadas son una forma de ocultar la complejidad y los detalles de implementación para el usuario de una clase. Esta es una característica bastante agradable. Pero no entiendo por qué en c ++ necesitamos ponerlos en el encabezado de una clase. Veo dos inconvenientes molestos para esto:
- Abarrota el encabezado del usuario
- Obliga a recompilar todas las bibliotecas de clientes cada vez que se modifican los componentes internos.
¿Hay alguna razón conceptual detrás de este requisito? ¿Es solo para facilitar el trabajo del compilador?
struct foo{};
) no está permitido, pero las declaraciones directas (struct foo;
) sí.Respuestas:
Esto se debe a que el compilador de C ++ debe conocer el tamaño real de la clase para asignar la cantidad correcta de memoria en la instanciación. Y el tamaño incluye todos los miembros, también los privados.
Una forma de evitar esto es usar el lenguaje Pimpl , explicado por Herb Sutter en su serie Guru of the Week # 24 y # 28 .
Actualizar
De hecho, esto (o más en general, la distinción del archivo de cabecera / fuente y
#include
s) es un obstáculo importante en C ++, heredado de C. En los días en que se creóC ++C, todavía no había experiencia con el desarrollo de software a gran escala, donde esto comienza a causar problemas reales. Los diseñadores de los lenguajes más nuevos tuvieron en cuenta las lecciones aprendidas desde entonces, pero C ++ está sujeto a requisitos de compatibilidad con versiones anteriores, lo que hace que sea realmente difícil abordar un problema tan fundamental en el lenguaje.fuente
private
es más moderna.La definición de clase debe ser suficiente para que el compilador produzca un diseño idéntico en la memoria donde sea que haya utilizado un objeto de la clase. Por ejemplo, dado algo como:
El compilador normalmente tendrá
a
un desplazamiento 0 yb
un desplazamiento4
. Si el compilador vio esto simplemente:"Pensaría" que
b
debería estar en el desplazamiento 0 en lugar del desplazamiento 4. Cuando el código que usa esa definición asignadab
, el código que usa la primera definición se veríaa
modificado, y viceversa.La forma habitual de minimizar los efectos de realizar cambios en las partes privadas de la clase generalmente se llama modismo de pimpl (sobre el cual estoy seguro de que Google puede proporcionar una gran cantidad de información).
fuente
Probablemente hay varias razones. Si bien la mayoría de las otras clases no pueden acceder a los miembros privados, las clases de amigos aún pueden acceder a ellos. Entonces, al menos en este caso, pueden ser necesarios en el encabezado, para que la clase amiga pueda ver que existen.
La recompilación de archivos dependientes puede depender de su estructura de inclusión. La inclusión de los archivos .h en un archivo .cpp en lugar de otro encabezado puede en algunos casos evitar largas cadenas de recompilaciones.
fuente