Cómo separar una clase y sus funciones miembro en archivos de encabezado y fuente
No sé cómo separar el código de implementación y declaración de una clase simple en un nuevo encabezado y archivo cpp. Por ejemplo, ¿cómo separaría el código de 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;
}
};
La declaración de clase va al archivo de encabezado. Es importante que agregues los #ifndef
protectores incluidos. La mayoría de los compiladores ahora también admiten #pragma once
. También he omitido el privado, por defecto los miembros de la clase C++ son privados.
// A2DD.h
#ifndef A2DD_H
#define A2DD_H
class A2DD
{
int gx;
int gy;
public:
A2DD(int x,int y);
int getSum();
};
#endif
y la implementación va en el archivo CPP:
// A2DD.cpp
#include "A2DD.h"
A2DD::A2DD(int x,int y)
{
gx = x;
gy = y;
}
int A2DD::getSum()
{
return gx + gy;
}
En general, su .h contiene la definición de clase, que son todos sus datos y todas sus declaraciones de métodos. Así en tu caso:
A2DD.h:
class A2DD
{
private:
int gx;
int gy;
public:
A2DD(int x,int y);
int getSum();
};
Y luego su .cpp contiene las implementaciones de métodos como este:
A2DD.cpp:
A2DD::A2DD(int x,int y)
{
gx = x;
gy = y;
}
int A2DD::getSum()
{
return gx + gy;
}
Es importante señalar a los lectores que se topan con esta pregunta cuando investigan el tema de manera más amplia que el procedimiento de respuesta aceptada no es necesario en el caso de que solo desee dividir su proyecto en archivos. Solo es necesario cuando necesitas múltiples implementaciones de clases individuales. Si su implementación por clase es una, solo un archivo de encabezado para cada una es suficiente.
Por lo tanto, del ejemplo de la respuesta aceptada solo se necesita esta parte:
#ifndef MYHEADER_H
#define MYHEADER_H
//Class goes here, full declaration AND implementation
#endif
Las definiciones del preprocesador #ifndef, etc. permiten que se utilice 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 "tirar este texto en este lugar".
Básicamente una sintaxis modificada de declaración/definiciones de funciones:
a2dd.h
class A2DD
{
private:
int gx;
int gy;
public:
A2DD(int x,int y);
int getSum();
};
a2dd.cpp
A2DD::A2DD(int x,int y)
{
gx = x;
gy = y;
}
int A2DD::getSum()
{
return gx + gy;
}