Crear un archivo de encabezado en C++

Jinku Hu 12 octubre 2023
  1. Utilice los sufijos .h o .hpp para crear un archivo de encabezado en C++
  2. Utilice archivos de encabezado para dividir bloques de funciones separados del programa en módulos
Crear un archivo de encabezado en C++

Este artículo explicará varios métodos de cómo crear un archivo de encabezado en C++.

Utilice los sufijos .h o .hpp para crear un archivo de encabezado en C++

Los programas contemporáneos rara vez se escriben sin bibliotecas, que son construcciones de código implementadas por otros. C++ proporciona un token especial - #include para importar archivos de encabezado de biblioteca necesarios y funciones externas o estructuras de datos. Tenga en cuenta que, por lo general, los archivos de encabezado de biblioteca tienen un sufijo de nombre de archivo particular como library_name.h o library_name.hpp. La estructura del programa C++ proporciona el concepto de archivos de encabezado para facilitar el uso de ciertos bloques de código reutilizables. Por lo tanto, los usuarios pueden crear sus propios archivos de encabezado e incluirlos en los archivos de origen según sea necesario.

Suponga que el usuario necesita implementar una clase llamada Point que contiene dos miembros de datos de tipo double. La clase tiene dos constructores y un operador + definido en ella. También tiene una función print para enviar los valores de ambos miembros de datos al flujo cout. Generalmente, también hay protectores de encabezado que incluyen la definición de clase Point para garantizar que no se produzcan conflictos de nombres cuando se incluyen programas relativamente grandes. Tenga en cuenta que debe haber un esquema de nomenclatura coherente para los nombres de variables definidos después de include guard; por lo general, estas variables reciben el nombre de la propia clase.

#ifndef POINT_H
#define POINT_H

class Point {
  double x, y;

 public:
  Point();
  Point(double, double);
  Point operator+(const Point &other) const;
  void print();
};

#endif

Otro método para estructurar un archivo de encabezado para la clase Point es incluir el código de implementación de la función en el mismo archivo. Tenga en cuenta que colocar el fragmento de código anterior en un archivo Point.hpp e incluirlo generará varios errores indefinidos. Dado que las funciones se definen en el siguiente código de ejemplo, podemos incluirlo como un archivo de encabezado Point.hpp y usar la clase con sus métodos.

#include <iostream>
#include <vector>

#ifndef POINT_H
#define POINT_H

class Point {
  double x, y;

 public:
  Point();
  Point(double, double);
  Point operator+(const Point &other) const;
  void print();
};

Point::Point() { x = y = 0.0; }

Point::Point(double a, double b) {
  x = a;
  y = b;
}

Point Point::operator+(const Point &other) const {
  return {x + other.x, y + other.y};
}

void Point::print() { std::cout << "(" << x << "," << y << ")" << std::endl; }

#endif

Utilice archivos de encabezado para dividir bloques de funciones separados del programa en módulos

Alternativamente, se puede utilizar un esquema de separación basado en módulos para los encabezados y los archivos fuente correspondientes de la clase dada para implementar una estructura de archivos de proyecto más flexible. En este diseño, se debe definir cada clase funcionalmente distinta en un archivo de encabezado .hpp separado e implementar sus métodos en un archivo fuente con el mismo nombre. Una vez que el archivo de encabezado necesario de la clase se incluye en el archivo fuente principal y se compila, el preprocesador combinará los bloques de código de todos los archivos de encabezado incluidos, y el resultado sería el mismo que compilar el siguiente código fuente, que implementa la funcionalidad en una sola archivo fuente.

#include <iostream>
#include <vector>

#ifndef POINT_H
#define POINT_H

class Point {
  double x, y;

 public:
  Point();
  Point(double, double);
  Point operator+(const Point &other) const;
  void print();
};

Point::Point() { x = y = 0.0; }

Point::Point(double a, double b) {
  x = a;
  y = b;
}

Point Point::operator+(const Point &other) const {
  return {x + other.x, y + other.y};
}

void Point::print() { std::cout << "(" << x << "," << y << ")" << std::endl; }
#endif

using std::cin;
using std::cout;

int main() {
  double x, y;

  cin >> x >> y;
  Point a1(x, y);
  cin >> x >> y;
  Point a2(x, y);

  cout << "a1: ";
  a1.print();
  cout << "a2: ";
  a2.print();

  a1 = a1 + a2;
  cout << "a1+a2: ";
  a1.print();

  exit(EXIT_SUCCESS);
}
Autor: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn Facebook

Artículo relacionado - C++ Header