Problèmes d'include avec deux classes

Résolu/Fermé
Utilisateur anonyme - Modifié par Aznimar le 6/08/2015 à 09:58
 VanDog - 11 août 2015 à 10:09
Bonjour, je souhaite associer deux classes comme l'UML suivant :


Mon problème viens lors des includes (Les classes d'includes en boucle j'imagine):





J'ai entendu parler de #ifndef #define #endif, mais j'ai pas réellement compris comment ça marchais

Merci pour votre aide !

1 réponse

VanDog Messages postés 63 Date d'inscription vendredi 17 juillet 2015 Statut Membre Dernière intervention 11 février 2016 13
Modifié par Whismeril le 7/08/2015 à 23:10
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 fichier
Proprietaire.h
demande l'inclusion de
voiture.h
dont la première ligne inclut
Proprietaire.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 simple
EST 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
0
Utilisateur anonyme
11 août 2015 à 08:54
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 ^^
0
Bonjour,

Ça me soulage, je ne me sentais pas très clair, d'où les répétitions.
N'hésite pas à revenir demander de l'aide, on est là pour ça.
Bonne suite !
0