Estoy confundido sobre cómo separar el código de implementación y declaraciones de una clase simple en un nuevo encabezado y archivo cpp. Por ejemplo, ¿cómo separaría el código para la siguiente clase?
class A2DD
{
private:
int gx;
int gy;
public:
A2DD(int x,int y)
{
gx = x;
gy = y;
}
int getSum()
{
return gx + gy;
}
};
public:
miembros en la parte superior podría afectar mucho , si el usuario los movió de acuerdo con este consejo, pero tenía dependencias de pedido entre los miembros y aún no sabía que los miembros se inicializan en el orden de su declaración ;-)Respuestas:
La declaración de clase va al archivo de encabezado. Es importante que agregue los
#ifndef
protectores de inclusión, o si está en una plataforma MS también puede usar#pragma once
. También he omitido lo privado, por defecto los miembros de la clase C ++ son privados.y la implementación va en el archivo CPP:
fuente
#ifndef
cosas en el encabezado?En general, su .h contiene la definición de clase, que son todos sus datos y todas sus declaraciones de método. Así en tu caso:
Y luego, su .cpp contiene las implementaciones de los siguientes métodos:
fuente
Es importante señalar a los lectores que se encuentran con esta pregunta cuando investigan el tema de manera más amplia que el procedimiento de respuesta aceptado no es necesario en el caso de que solo quieran dividir su proyecto en archivos. Solo es necesario cuando necesita múltiples implementaciones de clases individuales. Si su implementación por clase es una, solo un archivo de encabezado para cada uno es suficiente.
Por lo tanto, del ejemplo de la respuesta aceptada solo se necesita esta parte:
Las definiciones de preprocesador #ifndef etc. permiten que se use varias veces.
PD. El tema se vuelve más claro una vez que te das cuenta de que C / C ++ es 'tonto' y #include es simplemente una forma de decir "volcar este texto en este lugar".
fuente
.cpp
o solo es.h
realmente "bueno" para este método de organización del código?Básicamente una sintaxis modificada de declaración / definiciones de función:
a2dd.h
a2dd.cpp
fuente
A2DD.h
A2DD.cpp
La idea es mantener todas las firmas de funciones y miembros en el archivo de encabezado.
Esto permitirá que otros archivos del proyecto vean cómo se ve la clase sin tener que conocer la implementación.
Y además de eso, puede incluir otros archivos de encabezado en la implementación en lugar del encabezado. Esto es importante porque los encabezados incluidos en su archivo de encabezado se incluirán (heredarán) en cualquier otro archivo que incluya su archivo de encabezado.
fuente
Dejas las declaraciones en el archivo de encabezado:
Y poner las definiciones en el archivo de implementación.
Puede mezclar los dos (deje la
getSum()
definición en el encabezado, por ejemplo). Esto es útil ya que le da al compilador una mejor oportunidad de alinearse, por ejemplo. Pero también significa que cambiar la implementación (si se deja en el encabezado) podría desencadenar una reconstrucción de todos los demás archivos que incluyen el encabezado.Tenga en cuenta que para las plantillas, debe mantenerlo todo en los encabezados.
fuente
Por lo general, solo coloca declaraciones y funciones en línea realmente cortas en el archivo de encabezado:
Por ejemplo:
fuente
No voy a referirme también a su ejemplo, ya que es bastante simple para una respuesta general (por ejemplo, no contiene funciones con plantilla, que lo obligan a implementarlas en el encabezado), lo que sigo como regla general es el pimpl idioma
Tiene bastantes beneficios ya que obtienes tiempos de compilación más rápidos y el azúcar sintáctico:
class->member
en vez declass.member
El único inconveniente es el puntero adicional que paga.
fuente