Créer 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++ - Utiliser les fichiers d’en-tête pour décomposer les blocs fonctionnels séparés du programme en modules
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);
}
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