Problèmes d'include avec deux classes
Résolu
Utilisateur anonyme
-
VanDog -
VanDog -
1 réponse
-
Bonjour bonjour,
Je suis content qu'il y ait encore des questions C++ ^^
Alors voici ma réponse :
Les trois consignes de préprocesseur que tu as citées, à savoir#ifndef #define #endif
sont à utiliser dans cet ordre. On les appelle des balises gardiennes ou gardes fous, bref choisis ton petit nom pour ces consignes.
Leur but est d'éviter d'inclure plusieurs fois le même fichier. Par exemple, ton fichierProprietaire.h
demande l'inclusion devoiture.h
dont la première ligne inclutProprietaire.h
qui inclut.... Enfin bref, tu as une inclusion cyclique.
Pour éviter ce problème simplement qui revient toujours au cours de la création d'un programme, on utilise les balises gardiennes.
Le principe:
On définit une variable (qui souvent porte le nom du fichier ie: VOITURE_HPP) à la première inclusion du header (.h). Ensuite, les balises vérifient si cette variable existe pour continuer l'inclusion.
En gros :
#include "Voiture.h" -> #ifndef VOITURE_HPP // IF VOITURE_HPP is Not DEFined #define VOITURE_HPP // La variable n'existe par alors on la DEFINIT pour ne plus revenir ici. class ... {}; #endif // Si la variable existe alors on passe directement à cette ligne, l'include ne fait rien.
Voici comment on utilise ces balises: on inclut une unique fois, pour cela on utilise un procédé booléen simpleEST DEFINI / N'EST PAS DEFINI
Après, il peut exister un nouveau problème, bien plus léger :#include "voiture.hpp"
inclut un fichier depuis le dossier local#include <voiture.hpp>
inclut un fichier depuis le dossier signalé avant ( dans un Makefile, dans les propriétés de l'IDE etc...)
Pour aller dans le détail, ton IDE dit ne pas connaitre Proprietaire dans le fichier Voiture.hpp car lors de sa définition il revient sur sa définition et ne la finit jamais.
Edit suppression de la signature contraire à la charte-
Bonjour, merci beaucoup pour ta réponse !
J'avais bien identifié le problème (inclusion cyclique) mais je ne savais pas utiliser correctement les balises gardiennes.
Merci encore pour ta réponse détaillée, c'était facile à comprendre et très claire.
Ah et pour info, on apprend encore le C++ en BTS ^^ -
-


