Cómo separar una clase y sus funciones miembro en archivos de encabezado y fuente

Resuelto drdrdr asked hace 12 años • 8 respuestas

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;
  }
};
drdrdr avatar Mar 06 '12 15:03 drdrdr
Aceptado

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;
}
Ferenc Deak avatar Mar 06 '2012 08:03 Ferenc Deak

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;
}
Nick avatar Mar 06 '2012 08:03 Nick

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".

j riv avatar Jul 07 '2018 05:07 j riv

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;
}
Corbin avatar Mar 06 '2012 08:03 Corbin