Créer un fichier d'en-tête en C++

Jinku Hu 12 octobre 2023
  1. Utilisez les suffixes .h ou .hpp pour créer un fichier d’en-tête en C++
  2. Utiliser les fichiers d’en-tête pour décomposer les blocs fonctionnels séparés du programme en modules
Créer un fichier d'en-tête en C++

Cet article explique plusieurs méthodes de création d’un fichier d’en-tête en C++.

Utilisez les suffixes .h ou .hpp pour créer un fichier d’en-tête en C++

Les programmes contemporains sont rarement écrits sans bibliothèques, qui sont des constructions de code implémentées par d’autres. C++ fournit un jeton spécial - #include pour importer les fichiers d’en-tête de bibliothèque nécessaires et les fonctions externes ou les structures de données. Notez que, généralement, les fichiers d’en-tête de bibliothèque ont un suffixe de nom de fichier particulier comme library_name.h ou library_name.hpp. La structure du programme C++ fournit le concept de fichiers d’en-tête pour faciliter l’utilisation de certains blocs de code réutilisables. Ainsi, les utilisateurs peuvent créer leurs propres fichiers d’en-tête et les inclure dans les fichiers source selon leurs besoins.

Supposons que l’utilisateur ait besoin d’implémenter une classe nommée Point contenant deux données membres de type double. La classe a deux constructeurs et un opérateur + qui y sont définis. Il dispose également d’une fonction print pour sortir les valeurs des deux données membres dans le flux cout. Généralement, il existe également des protections d’en-tête englobant la définition de classe Point pour s’assurer qu’aucun conflit de nom ne se produit lors de l’inclusion dans des programmes relativement volumineux. Notez qu’il devrait y avoir un schéma de dénomination cohérent pour les noms de variables définis après include guard; généralement, ces variables sont nommées d’après la classe elle-même.

#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

Une autre méthode pour structurer un fichier d’en-tête pour la classe Point est d’inclure le code d’implémentation de la fonction dans le même fichier. Notez que mettre l’extrait de code précédent dans un fichier Point.hpp et l’inclure soulèvera plusieurs erreurs non définies. Les fonctions étant définies dans l’exemple de code suivant, nous pouvons l’inclure comme fichier d’en-tête Point.hpp et utiliser la classe avec ses méthodes.

#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

Utiliser les fichiers d’en-tête pour décomposer les blocs fonctionnels séparés du programme en modules

En variante, on peut utiliser un schéma de séparation basé sur des modules pour les en-têtes et les fichiers source correspondants de la classe donnée pour implémenter une structure de fichier de projet plus flexible. Dans cette conception, il faut définir chaque classe fonctionnellement distincte dans un fichier d’en-tête .hpp séparé et implémenter ses méthodes dans un fichier source du même nom. Une fois que le fichier d’en-tête nécessaire à la classe est inclus dans le fichier source principal et compilé, le préprocesseur combinera les blocs de code de tous les fichiers d’en-tête inclus, et le résultat serait le même que la compilation du code source suivant, qui implémente la fonctionnalité en un seul fichier source.

#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);
}
Auteur: 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