[C++] inclusion multiple.

Résolu/Fermé
Panda jack Messages postés 54 Date d'inscription dimanche 13 mars 2011 Statut Membre Dernière intervention 18 avril 2012 - 16 avril 2012 à 15:21
Panda jack Messages postés 54 Date d'inscription dimanche 13 mars 2011 Statut Membre Dernière intervention 18 avril 2012 - 18 avril 2012 à 15:50
Bonjour,

actuellement sur un projet en C++ pour mes études je souhaite le faire en suivant une architecture MVC (Modèle Vue Contrôleur) l'ayant déjà fait mais sur un projet Java, il faut en toute logique passer le contrôleur aux vue pour qu'elle puisse y faire appel (c'est lui qui contrôle entre-autre l'affichage des autres fenêtres). Sauf que voilà, ce qui ce ait bien en Java ce fait moins bien en C++ et plus particulièrement avec l'include de mes divers fichiers .h

Le contrôleur.h incluant le fichier fenêtre.h et le fichier fenetre.h incluant contrôleur.h ne pose pas de problème ... mais quand le fichier contrôleur.cpp inclut controleur.h et que fenetre.cpp inclut fenetre.h ; en toute logic le programme plante (une versification de non inclusion multiple étant fait dans les headers les fichier source ne peuvent pus les inclure).

Je ne sait pas si mes explications sont très claires, je n'ai pas mis le code car il est un peut long mais si cela peut vous aidez a m'aidez je peut le faire.

Merci d'avance de votre réponse, je suis vraiment perdu :'(

4 réponses

Utilisateur anonyme
16 avril 2012 à 15:24
salut !
je pense que comme pour le mvc, tes classes ne doivent pas s'inclure entre elles mais simplement le main.
enfin je veux dire qu'il faut que tu fasse tes liaisons uniquement de manière hierarchique, et donc que les classes model n'incluent pas d'autres models, et de même pour les controlleur.

En fait il faut que sépare clairement les traitements je pense.
bne chance !
0
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
16 avril 2012 à 15:57
Bonjour,
Le C++ est différent du Java, il faut penser autrement.
En C++ les fichiers sont séparé, il y a plusieurs compilation.
Les règles pour les fichiers .h c'est de mettre des balises de garde :
#ifdef _BALISE
#define _BALISE
... // ton code
#endif
dans chaque fichier .h avec bien entendu un nom différent pous _BALISE.
Ensuite, il faut que les .h ne contiennent que les déclarations, c'est à dire que les morceaux de code et de membres de classe doivent être mis dans un autre fichier, un fichier source.

Essai de simlpifier au maximum ton problème pour en faire un "demonstrateur". Ou/et copie ici la sortie erreur que te donne le compilateur.
0
Panda jack Messages postés 54 Date d'inscription dimanche 13 mars 2011 Statut Membre Dernière intervention 18 avril 2012 7
Modifié par Panda jack le 18/04/2012 à 14:29
Bonjour,

tout d'abord, merci de vos réponse. Cependant malgré vos conseil je n'ai pas réussi a faire fonctionner mon code. Voici un aperçu simplifier de du contenus de mes fichiers.
Le controelur:
le header:
#ifndef CONTROLEUR_H 
#define CONTROLEUR_H 
#include "fenetre.h" 
class controleur{ 
public: 
     conroleur(); 
private: 
     fenetre *fen; 
}; 
#endif

la source
#include "controleur.h" 
controleur::controleur(){ 
     fen= new fenetre(&this); 
     fen->show(); 
}

La fenetre:
le header:
#ifndef FENETRE_H 
#define FENETRE_H 
#include "controleur.h" 
class fenetre{ 
public: 
     fenetre(controleur *control); 
private: 
     controleur *control; 
//[...] la déclaration des différent item de ma fenetre 
}; 
#endif

la source:
#include "reservation.h" 
fenetre::fenetre(controleur *Control){ 
control=Control; 
//[...] tout le reste inutile}

Le main:
#include "controleur.h" 
int main(int argc, char *argv[]){ 
     controleur control; 
     return 0; 
}

Les erreurs:
expeted ")" befor "*" token //a la ligne de la déclaration du constructeur dans fenetre.h 
ISO C++ forbids declaration of 'controelur' whith no type //a la ligne "controelur *control" de fenetre.h 
expected ";" befor token "*"//à la même ligne

Voilà, cela est un peut indigeste, merci d'avance de vos réponses.
0
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
18 avril 2012 à 15:11
ok, je crois voir le problème, tu as des classes interdépendante, c'est à dire que A utilise B, mais B utilise A.
Dans ce cas là il faut faire une déclaration de classe vide :
La fenetre:
le header:

#ifndef FENETRE_H 
#define FENETRE_H 
class controleur;
class fenetre{ 
public: 
     fenetre(controleur *control); 
private: 
     controleur *control; 
//[...] la déclaration des différent item de ma fenetre 
}; 
#endif
J'espère qu'il n'y a pas autant de fautes de frappe dans ton vrai code.
0
Panda jack Messages postés 54 Date d'inscription dimanche 13 mars 2011 Statut Membre Dernière intervention 18 avril 2012 7
18 avril 2012 à 15:20
Merci, je test cela et je vous redonne des nouvel. Et rassurée vous mon code ne contient pas de faute de frappe, c'est juste que je l'ai recopier au lieux d'un copier/coller.
0
Panda jack Messages postés 54 Date d'inscription dimanche 13 mars 2011 Statut Membre Dernière intervention 18 avril 2012 7
18 avril 2012 à 15:50
Géniale ! Cela marche a merveille, merci beaucoup de m'avoir sorti de l'impasse.
0