Me preguntaba cuáles son las diferencias entre declarar e implementar una clase únicamente en un archivo de encabezado, en comparación con el enfoque normal en el que protype clase en el encabezado e implementar en un archivo .cpp efectivo.Diferencia entre implementar una clase dentro de un archivo .h o en un archivo .cpp
Para explicar mejor lo que estoy hablando me refiero a las diferencias entre aproximación normal:
// File class.h
class MyClass
{
private:
//attributes
public:
void method1(...);
void method2(...);
...
};
//file class.cpp
#include "class.h"
void MyClass::method1(...)
{
//implementation
}
void MyClass::method2(...)
{
//implementation
}
y una justo cabecera enfoque:
// File class.h
class MyClass
{
private:
//attributes
public:
void method1(...)
{
//implementation
}
void method2(...)
{
//implementation
}
...
};
yo puede conseguir la diferencia principal: en el segundo caso, el código se incluye en todos los demás archivos que lo necesitan generando más instancias de las mismas implementaciones, por lo que una redundancia implícita; mientras que en el primer caso, el código se compila solo y luego cada llamada referida al objeto MyClass
está vinculada a la implementación en class.cpp
.
¿Pero hay otras diferencias? ¿Es más conveniente usar un enfoque en lugar de otro dependiendo de la situación? También he leído en alguna parte que la definición del cuerpo de un método directamente en un archivo de encabezado es una solicitud implícita al compilador para alinear ese método, ¿es cierto?
Si tiene las protecciones de preprocesador adecuadas, no creará más instancias de la misma implementación. –
¿Estás hablando de #ifndef _CLASS_H_ #define _CLASS_H_ etc. ..? – Jack
@Andrew: claro que sí, si son dos.Los archivos cpp incluyen el mismo encabezado, luego cada compilará su contenido completo independientemente de las protecciones del preprocesador, y ese contenido compilado estará presente en el archivo del objeto de salida. Los duplicados solo serán eliminados por el vinculador. Los protectores del preprocesador deben manejar con gracia la doble inclusión de un encabezado por una sola unidad de traducción, sin compartir entre las unidades de traducción. –