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 :

[DEBUTANT] Déclaration d'objet et appel d'include


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2007
    Messages
    180
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Août 2007
    Messages : 180
    Par défaut [DEBUTANT] Déclaration d'objet et appel d'include
    Salut à tous,

    on m'a soumis un problème de compil hier soir. Le soucis est résolu, mais j'ai un doute sur l'explication que j'ai fourni.

    Le code présentait à mon sens 2 implémentations douteuses.

    4 fichiers : A.h A.cpp B.h et B.cpp

    1. Malgré les ifndef, A.h incluer B.h et vice versa.
    2. Dans A.h, la classe avait un objet B.

    A la compilation du fichier B.cpp, le type B n'était pas reconnu.

    Venant du C, mon idée est que le compilo ne connait pas encore la classe B.
    Dans B.h, j'inclus A.h, donc ma classe B apparait à la compilation de B.cpp, mais B n'est pas encore défini, car il apparait plus bas dans le code.
    Je voudrais savoir si en C++, le compilo peut compiler, sans pour le moment connaître l'objet et que l'erreur vient du fait que A.h inclue B.h (vice versa), de cette déclaration avant la définition de l'objet, voir les 2.

    Au final, on a supprimé A.h de B.h... le tour était joué.

    Merci.

  2. #2
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Par défaut
    regarde du coté de la forward déclaration (présent dans la FAQ du site).
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2007
    Messages
    180
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Août 2007
    Messages : 180
    Par défaut
    Merci, ça aurait aussi résolu le problème.

    J'en déduis que l'on peut (par cette notion de forward) faire des appels croisés entre class. Mais sans ça, le compilateur ne retrouve pas la classe appelée.

  4. #4
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Salut,
    Citation Envoyé par LoDev Voir le message
    Merci, ça aurait aussi résolu le problème.

    J'en déduis que l'on peut (par cette notion de forward) faire des appels croisés entre class. Mais sans ça, le compilateur ne retrouve pas la classe appelée.
    Je dirais que tu peux effectivement avoir des appels croisés, tant que le compilateur n'a pas besoin de connaitre le contenu réel "l'autre classe"...

    Le compilateur lit le code un peu à la façon dont tu lis un roman: lorsque tu est à la page 10, tu ne sais rien de ce qui se trouve à la page 12, mais tu "connait" ce qui s'est passé avant...

    Le compilateur fonctionne de la même manière.

    Dés lors, tant que tu te contente de déclarer un argument ou une valeur de retour sous la forme d'une référence (constante ou non), ou que tu déclare un pointeur sur une instance d'une classe dont le compilateur sait qu'elle existe (car les pointeurs ont tous la même taille, quelle que soit la taille de l'objet réellement pointé), il n'y a pas de problème.

    Par contre, dés le moment où il s'agit d'accéder au contenu de la classe (que ce soit au travers de ses fonctions membres ou des membres eux-mêmes), il faut que le compilateur sache que le membre ou la fonction membre existe...

    Il doit donc disposer... de la déclaration de ce membre ou de cette fonction membre, et donc... disposer de la définition d'une classe.

    De même, pour pouvoir utiliser une instance de la classe, il doit savoir l'espace que l'objet utilisera en terme de mémoire, or la déclaration anticipée ne suffit pas pour lui permettre de calculer cet espace... Le compilateur a donc, là aussi, beson de la définition complète de la classe
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Convention]déclarations des objets
    Par allstar dans le forum Langage
    Réponses: 4
    Dernier message: 17/11/2005, 00h57
  2. [debutant]passer un objet par const reference
    Par Battosaiii dans le forum Débuter
    Réponses: 6
    Dernier message: 12/11/2005, 14h39
  3. [debutant] le compareTo (Objet autreObjet)
    Par kortnor dans le forum Langage
    Réponses: 8
    Dernier message: 24/07/2005, 13h09
  4. [Debutant] Faire un objet redimensionnable
    Par deboll_s dans le forum AWT/Swing
    Réponses: 1
    Dernier message: 04/07/2005, 21h18
  5. [JSP][Debutant]recuperer un objet d'une page a l'autre
    Par zozolh2 dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 17/05/2004, 10h25

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