Découper le code en plusieurs fichiers
Découper un programme C++ en plusieurs fichiers peut améliorer l’organisation et la lisibilité du code, ainsi que faciliter la maintenance et la réutilisation des fonctions et des classes. Voici un cours sur le découpage d’un programme C++ en plusieurs fichiers:
En C++, un programme peut être divisé en plusieurs fichiers, généralement regroupés en deux catégories: les fichiers d’en-tête (header files) et les fichiers source (source files). Les fichiers d’en-tête, qui ont généralement l’extension .h ou .hpp, contiennent les déclarations de fonctions, de classes, de variables globales, de constantes, etc. Les fichiers source, qui ont généralement l’extension .cpp, contiennent les définitions des fonctions et des méthodes de classes déclarées dans les fichiers d’en-tête.
Pour utiliser une fonction ou une classe définie dans un autre fichier, il suffit d’inclure le fichier d’en-tête correspondant en utilisant la directive #include. Par exemple, si nous avons un fichier fonctions.h qui contient la déclaration d’une fonction addition, nous pouvons l’utiliser dans un autre fichier en incluant fonctions.h comme suit:
#include "fonctions.hpp"
int main() {
int x = 5, y = 3;
int z = addition(x, y);
// ...
return 0;
}
Il est important de noter que les fichiers d’en-tête ne doivent contenir que des déclarations et non des définitions. Les définitions doivent être placées dans les fichiers source correspondants. De plus, pour éviter les problèmes de double inclusion, il est recommandé d’utiliser des gardes d’inclusion (include guards) dans les fichiers d’en-tête. Les gardes d’inclusion sont des directives préprocesseur qui empêchent un fichier d’être inclus plusieurs fois dans un même fichier source. Voici un exemple de garde d’inclusion pour un fichier fonctions.h:
#ifndef FONCTIONS_H
#define FONCTIONS_H
// Déclaration de la fonction addition
int addition(int a, int b);
#endif
Voici le code pour le fichier fonctions.cpp qui implémente la fonction addition déclarée dans le fichier fonctions.h:
#include "fonctions.hpp"
int addition(int a, int b) {
return a + b;
}
Dans ce code, nous incluons le fichier d’en-tête fonctions.h pour avoir accès à la déclaration de la fonction addition. Nous implémentons ensuite la fonction addition en prenant deux entiers en entrée et en renvoyant leur somme.
#include. Les gardes d’inclusion peuvent être utilisées pour éviter les problèmes de double inclusion.
mymath.hpp:
#ifndef MYMATH_H
#define MYMATH_H
// Déclaration des fonctions mathématiques
double addition(double a, double b);
double soustraction(double a, double b);
double multiplication(double a, double b);
double division(double a, double b);
#endif
mydatascience.hpp:
#ifndef MYDATASCIENCE_H
#define MYDATASCIENCE_H
#include <vector>
// Déclaration des fonctions de data science
double moyenne(const std::vector<double>& data);
double mediane(const std::vector<double>& data);
double variance(const std::vector<double>& data);
double ecartType(const std::vector<double>& data);
#endif
Le fichier mymath.h contient les déclarations de quatre fonctions mathématiques: addition, soustraction, multiplication et division. Ces fonctions prennent deux paramètres a et b de type double et renvoient le résultat de l’opération correspondante.
Le fichier mydatascience.h contient les déclarations de quatre fonctions de data science: moyenne, mediane, variance et ecartType. Ces fonctions prennent un paramètre data de type std::vector<double> représentant un ensemble de données et renvoient une mesure statistique calculée à partir de ces données.
Ces fichiers d’en-tête peuvent être utilisés pour organiser votre code en regroupant les déclarations de fonctions dans des fichiers séparés. Vous pouvez ensuite inclure ces fichiers dans vos fichiers source pour utiliser les fonctions déclarées.
Pour chaque fichier .hpp il faut un fichier .cpp associé avec le même nom.
Voici un exemple de programme C++ qui utilise les fichiers mymath.h et mydatascience.h dans la fonction main:
#include <iostream>
#include <vector>
#include "mymath.h"
#include "mydatascience.h"
int main() {
// Utilisation des fonctions mathématiques
double x = 5.0, y = 3.0;
std::cout << x << " + " << y << " = " << addition(x, y) << std::endl;
std::cout << x << " - " << y << " = " << soustraction(x, y) << std::endl;
std::cout << x << " * " << y << " = " << multiplication(x, y) << std::endl;
std::cout << x << " / " << y << " = " << division(x, y) << std::endl;
// Utilisation des fonctions de data science
std::vector<double> data = {1.0, 2.0, 3.0, 4.0, 5.0};
std::cout << "Moyenne: " << moyenne(data) << std::endl;
std::cout << "Médiane: " << mediane(data) << std::endl;
std::cout << "Variance: " << variance(data) << std::endl;
std::cout << "Écart-type: " << ecartType(data) << std::endl;
return 0;
}
Dans cet exemple, nous avons inclus les fichiers mymath.h et mydatascience.h dans notre fichier main.cpp en utilisant la directive #include. Cela nous permet d’utiliser les fonctions déclarées dans ces fichiers dans notre programme.
Dans la fonction main, nous utilisons les fonctions mathématiques définies dans mymath.h pour effectuer des opérations sur deux nombres x et y. Nous affichons ensuite les résultats à l’écran en utilisant la fonction std::cout.
Nous utilisons également les fonctions de data science définies dans mydatascience.h pour calculer des mesures statistiques sur un ensemble de données stocké dans un std::vector<double>. Nous affichons ensuite ces mesures à l’écran en utilisant la fonction std::cout.
En résumé, cet exemple montre comment utiliser les fichiers d’en-tête mymath.h et mydatascience.h dans un programme C++ en incluant ces fichiers dans notre fichier source et en appelant les fonctions déclarées dans ces fichiers.
Résumé
Il est recommandé de diviser un programme C++ en plusieurs fichiers lorsque sa taille augmente. Les fichiers .cpp contiennent les définitions des fonctions, tandis que les fichiers .hpp, plus courts, contiennent leurs prototypes. Les fichiers .hpp permettent d’annoncer l’existence des fonctions à tous les autres fichiers du programme.
Seuls les prototypes doivent contenir les valeurs par défaut, pas les définitions des fonctions. De plus, les valeurs par défaut doivent être placées à la fin de la liste des paramètres, c’est-à-dire à droite.
En résumé, diviser un programme C++ en plusieurs fichiers permet d’améliorer l’organisation et la lisibilité du code en regroupant les prototypes et les définitions des fonctions dans des fichiers séparés. Les valeurs par défaut doivent être spécifiées uniquement dans les prototypes et placées à la fin de la liste des paramètres.