IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C++ Discussion :

organisation des instructions du pre processeur


Sujet :

C++

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 73
    Par défaut organisation des instructions du pre processeur
    bonjour à tous !

    Je suis sur un projet wxWidgets mais mon problème est plus lié a la compréhension du C++ ou du C

    Sur ce projet j'ai 8 fichiers .h et autant de .cpp

    En partant d'un tutoriel, pour organiser mes #include (car plusieurs classe s'appellent entres elles), j'ai fait:
    Dans mes .cpp un #include du fichier .h correspondant
    et dans tous les .h:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    #ifndef NOM_DU_FICHIER_H
    #define NOM_DU_FICHIER_H
     
    #include tous les noms des autres fichiers .h
     
    .....mon code...
     
    #endif

    Le probleme est que maintenant j'ai des erreurs "error: ISO C++ forbids declaration of `PanMenu' with no type"

    Donc ma class PanMenu n'est pas reconnu pourtant mon fichier panmenu.h est bien inclus....

    ça marchait pourtant avant que je me lance dans cette re-organisation....

    Comment organise t'on les include ?

    Merci de votre aide

  2. #2
    Membre Expert
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Par défaut
    Apparemment dans ton cas les fichiers .h doivent être inclus dans un certain ordre.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #include tous les noms des autres fichiers .h
    #include que ceux dont tu as vraiment besoin dans ton fichiers .h, pas les autres.

    Puis, dans ton main, inclus les fichiers .h dans le bon ordre.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 73
    Par défaut
    Merci de ta reponse.

    Je me suis demandé aussi si l'ordre était important.
    Mais comment savoir l'ordre de compilation des fichiers (avec les instructions peu être..) j'ai essayé de coller aux instructions, sans resultat.

    Bon je vais essayer ce que tu me dis.

    Merci encore


    PS: ça a fonctionné.....Cependant j'avance a taton, sans réel logique. Enfin si, je pensais devoir ajouter l'entête .h contenant la classe que je cherche a ajouter mais le résultat n'est pas au rendez vous...C'est embêtant.

  4. #4
    Membre chevronné
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    349
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2005
    Messages : 349
    Par défaut
    L'ordre d'inclusion des fichiers n'a pas d'importance, et fais attention de ne pas te tromper avec tes #ifndef NOM_DU_FICHIER_H #define NOM_DU_FICHIER_H .
    Et chaque fichier ne devrait inclure que le minimum dont il a besoin.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 73
    Par défaut
    Et bien apparement il y a une importance dans l'ordre car enchangeant les erreurs sont differentes.
    De plus en ne faisant qu'inclure tous les fichiers a partir du point depart (mon init) je me suis rendu compte que 2 classes avaient besoin d'être chargées ensembles....

    Je m'explique:
    la classe B a besoin que la classe A soit declarée avant et la classe A a besoin que la classe B soit declarée aussi avant....

    un casse tête !

  6. #6
    Membre Expert
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Par défaut
    Par ex:

    Code A.hpp : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #ifndef GUARD_A
    #define GUARD_A
     
    class B;
     
    class A
    {
        B *item;
        ...
    };
     
    #include "B.hpp"
     
    #endif

    Code B.hpp : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #ifndef GUARD_B
    #define GUARD_B
     
    #include "A.hpp"
     
    class B : public A
    {
        ...
    };
     
    #endif

    Voilà un exemple où B a besoin d'être déclarée avant A et A d'être définie avant B

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 73
    Par défaut
    Merci pour ton exemple mais je ne vois pas comment je vais appliquer ça a mon code déjà chargé de classe dérivées et donc les classe appelante son au nombre de 4.

    J'ai re-ecris ce code pour le rendre + modulaire et je crois que je n'ai pas l'experience neccessaire....

  8. #8
    Membre Expert
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Par défaut
    Peux-tu expliquer les dépendances?

    Par exemple, pourquoi inclure la classe de base avant la classe dérivée ne suffit pas?

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 73
    Par défaut
    En fait mes classes sont dérivées des classes des lib wxWidgets.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    class Panleft:public wxPanel
    {
    }
    J'ai fais une fenetre en plusieurs éléments: Un panel droit, gauche, un autre qui devra remplacer le droit lors d'un clic et chacun des panels contient des controles qui inter agisse sur certains panels de la fenêtre.

    J'ai voulu faire un objet de chaques éléments.

    Jusque là ça passé mais maintenant je me rends compte que j'aurais mieux fais de garder un seul fichier vu qu'il a des inter actions un peu dans tous les sens.....



    PS: Ja'i fini par pendre le temps ajouter des heritage de classe + les fichiers .h d'entête mais c'est idem....je tourne en boucle.

  10. #10
    Membre chevronné
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    349
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2005
    Messages : 349
    Par défaut
    Si tu as des inclusions mutuelles, tu dois effectivement déclarer comme ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    #include "B.h"
     
    class B;
     
    class A
    {
    	B* b;
    };
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #include "A.h"
     
    class A;
     
    class B
    {
    private:
    	A* a;
    };
    Remarque que tu dois alors obligatoirement utiliser des pointeurs et créer/détruire tes objets avec new/delete. Et puis dans ce genre de cas faut évidemment faire attention à ce que tu fais, ça peut être dangereux. Demande-toi aussi si tu as absolument besoin de l'inclusion mutuelle ou si ce n'est pas une erreur de conception objet.

    Et l'ordre d'inclusion n'a pas d'importance, si les erreurs changent ou disparaissent c'est qu'il y a une autre erreur (par exemple A inclue B et C, C a besoin de B mais ne l'inclue pas mais comme A l'inclue avant ça marche quand même).

  11. #11
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Petite astuce : Pour simplifier tout, il faut que tes .h soient autonomes, c'est à dire qu'on puisse #include n'importe lequel de tes .h sans rien avoir inclus d'autre avant. Comment le vérifier ? J'ai pris le réflexe dans toto.cpp d'inclure en tout premier toto.h, comme ça je m'assure que pour chaque .h, il y a un fichier qui l'inclue sans rien avant.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  12. #12
    Membre Expert
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Par défaut
    Si tu n'as pas besoin de posséder dans un panel un panel d'un autre type, tu peux faire comme ça:

    Code panel_a.hpp : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #ifndef PANEL_A
    #define PANEL_A
     
    #include <wxwidgets.h>
     
    class panel_B;
    class panel_C;
     
    class panel_A
    {
       ...
    };
     
    #endif


    Code panel_b.hpp : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #ifndef PANEL_B
    #define PANEL_B
     
    #include <wxwidgets.h>
     
    class panel_A;
    class panel_C;
     
    class panel_B
    {
       ...
    };
     
    #endif


    Code panel_c.hpp : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #ifndef PANEL_C
    #define PANEL_C
     
    #include <wxwidgets.h>
     
    class panel_A;
    class panel_B;
     
    class panel_C
    {
       ...
    };
     
    #endif

    Et tu mets les corps de tes fonctions dans les fichiers .cpp, pas dans les entêtes.

    Si dans les définitions de tes fonctions les objets sont seulement passés par pointeurs ou par référence, il ne devrait pas y avoir de problèmes.

Discussions similaires

  1. Liste des instructions de la bibl. std c++
    Par BBric dans le forum SL & STL
    Réponses: 7
    Dernier message: 29/10/2004, 01h02
  2. Organisation des classes
    Par R3iTt0R dans le forum Langage
    Réponses: 2
    Dernier message: 02/06/2004, 18h27
  3. Temps d'exécution des instructions FPU
    Par ubi dans le forum Assembleur
    Réponses: 2
    Dernier message: 24/10/2003, 19h39
  4. Mesurer le temps des instructions
    Par luckylucke dans le forum Assembleur
    Réponses: 9
    Dernier message: 03/09/2003, 22h23

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo