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 :

Classe utilisant une classe


Sujet :

C++

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2011
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2011
    Messages : 31
    Points : 22
    Points
    22
    Par défaut Classe utilisant une classe
    Bonjour,

    Je suis amené à travailler sur plusieurs fichiers et classes en c++, et j'ai un problème assez étrange.

    J'ai dans mon projet 2 dossiers que j'appellerai A et B. Le dossier A contient 2 fichiers qui sont topological-map.hh et graphGrammar.hh.
    Le dossier B contient entre autre un fichier dart.hh.
    Dans les deux fichiers du dossier A sont définit respectivement des classes que j'appellerai pour simplifier T (dans topological-map.hh) et G (dans graphGrammar.hh).
    La classe T marche parfaitement de base, je ne l'ai pas implémentée et je n'y ait pas touchée. En revanche, dans graphGrammar.hh je défini G, entre autre à l'aide de T. Et quand j'essaie de compiler, j'ai droit à un magnifique :
    In file included : [emplacement], from [emplacement], etc...
    liste d'emplacements qui se termine par :
    :"../A/graphGrammar.hh" [a noter que le seul include que j'ai fait qui soit sous cette forme se situe dans B/dart.hh]
    ‘T’ does not name a type (quand je veux le passer en paramètre dans une fonction de la classe G)
    ‘T’ has not been declared (comme T est un des attributs décrivant G)
    Bon, comme je ne suis pas stupide (enfin j'espère -_-) j'ai d'abord vérifié les imports, et j'ai bien au début du fichier :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    #ifndef GRAPHGRAMMAR_H
    #define GRAPHGRAMMAR_H
    #include "topological-map.hh"
    etc...
    Là je me dit que je dois avoir une erreur de path pour aller chercher mon fichier topological-map.hh, mais non puisque tous sont dans le même dossier.

    De plus mon IDE me permet bien ne naviguer d'un simple Ctrl + click sur les occurences de T qui sont dans le fichier GraphGrammar.hh, j'arrive bien dans le fichier topological-map.hh à l'emplacement ou est définie la classe ce qui prouve bien que l'ide arrive à trouver la classe nécessaire.

    Je ne sais vraiment pas à quoi cela peut être dû, et je pense avoir donné absolument tous les détails, et pourtant malgré mes recherches je ne trouve pas ou est le problème, et pourtant j'ai déjà eu a utiliser des classes par le passé !

    Si quelqu'un pouvait m"aider, il serait mon héros du jour, que dis-je du mois !

    Merci d'avance

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 705
    Points
    2 705
    Par défaut
    Ne serait-ce pas un problème d'espace de nom ?

  3. #3
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Salut,

    Attends, laisse moi deviner...
    G utilise T, mais T utilise aussi G, non

    Si oui, tu es typiquement confronté à un problème de référence croisée.

    Un petit tour vers la FAQ te permettra de comprendre ce qu'il faut faire et pourquoi

    On en a rarement conscience quand on commence, mais:
    1. le compilateur ne connait que ce qu'il a déjà rencontré (il ne connait, à la ligne 10 d'un fichier, que ce qu'il a rencontré entre les lignes 1 et 9)
    2. la directive préprocesseur #include a pour résultat de copier intégralement le contenu du fichier indiqué
    3. si un fichier en inclue un autre dans lequel le premier fichier est lui-même inclus, le préprocesseur "perd la boule"
    4. si le compilateur rencontre dans la classe F le symbole de la classe G qu'il ne connait pas, il ne sera pas content non plus
    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

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2011
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2011
    Messages : 31
    Points : 22
    Points
    22
    Par défaut
    C'est en effet possible étant donné le nombre d'inclusions entre toutes les autres classes.

    Je ne maîtrise pas super bien le principe de déclaration anticipée, et et me fondant sur la FAQ et d'autres sites j'ai procédé comme suit :

    Fichier GraphGrammar.hh

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #ifndef GRAPHGRAMMAR_H
    #define GRAPHGRAMMAR_H
     
    #include "topological-map.hh"
    [liste include]
     
    class CTopologicalMap;
    class GraphGrammar
    {
         procédures utilisant la classe T définie dans topological-map.hh
         attributs de la classe dont l'un est de type T
    };
    Fichier graphGrammar.cc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    #include "graphGrammar.hh"
    #include "topological-map.hh"
    contenu inchangé
    Fichier topological-map.hh
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    #include "../ihmQT/graphGrammar.hh"
    Fichier topological-map.cc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    #include topological-map.hh
    Depuis j'ai des erreurs m'annonçant que T qui est appelé comme paramètre de fonctions dans graphGrammar.hh est ambigu, et que l'attribut de type T dans C est de type incomplet.

Discussions similaires

  1. Poo : utiliser une classe dans une classe ?
    Par devoluti0n dans le forum Langage
    Réponses: 2
    Dernier message: 28/10/2010, 17h03
  2. Utiliser une classe dans une autre
    Par Palca dans le forum ActionScript 3
    Réponses: 9
    Dernier message: 03/06/2009, 00h19
  3. utiliser des classes dans une classe
    Par dsant dans le forum C++
    Réponses: 4
    Dernier message: 10/03/2008, 16h22
  4. Réponses: 5
    Dernier message: 03/04/2006, 09h57
  5. [POO] Utilisation d'une classe dans une classe !
    Par Okinou dans le forum Langage
    Réponses: 3
    Dernier message: 16/02/2006, 14h34

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