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 :

Pré-déclaration d'une classe dans un namespace


Sujet :

C++

  1. #1
    Invité
    Invité(e)
    Par défaut Pré-déclaration d'une classe dans un namespace
    Bonjour à tous !

    J'ai 5 fichiers :

    main.cpp

    classA.hpp // Dans un namespace ii
    classA.cpp

    classB.hpp
    classB.cpp

    Dans le fichier classB.cpp, j'inclus le fichier classA.hpp. Mais étant donné que j'ai besoin d'un membre classA, dans l'en-tête classB.hpp, je pré-déclare classA comme je le fais dans le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    class ii::classA;
     
    class classB
    {
    private:
      ii:classA* m_var;
    //etc...
    Mais cela ne semble pas fonctionner... J'ai une erreur du type : 'ii' has not been declared. Pourquoi ? Merci pour vos réponses.

  2. #2
    Membre éclairé Avatar de MatRem
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    750
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 750
    Points : 693
    Points
    693
    Par défaut
    Le nom utilisé pour une déclaration de classe ne doit pas contenir de ::;

    Tu peux déclarer ta classe comme ça par contre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    namespace ii
    {
       class classA;
    }

  3. #3
    Invité
    Invité(e)
    Par défaut
    Merci pour ton aide, j'ai essayé et ça semble fonctionné malgré un petit détail.

    Imaginons que classA contienne une autre classe appelons là classC, j'essaye la chose suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    namespace ii
    {
        class classA;
        class classA::classC;
    }
    J'obtiens l'erreur suivante : 'classC' in class 'ii::classA' does not name a type

    Qu'ai-je fais de mal ?

  4. #4
    Membre éclairé Avatar de MatRem
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    750
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 750
    Points : 693
    Points
    693
    Par défaut
    Je crois, malheureusement, qu'il n'est pas possible de déclarer une classe interne en dehors de la portée de la classe qui la contient.

  5. #5
    Membre habitué Avatar de nowahn
    Homme Profil pro
    Inscrit en
    Août 2008
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 84
    Points : 150
    Points
    150
    Par défaut
    Bonjour,

    Citation Envoyé par Abdelite
    j'ai besoin d'un membre classA, dans l'en-tête classB.hpp
    Dans ce cas, il faut que classA soit définie (et pas seulement déclarée) au moment où tu a besoin de ce membre. Donc il faut à priori que tu inclus classA.hpp dans classB.hpp avant ce membre en question.

    Sinon, sache que pour déclarer un pointeur classA*, une déclaration de classA suffit (pas besoin de la définition).

  6. #6
    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,

    Tu ne peux en effet pas déclarer anticipativement une classe imbriquée.

    Et cela a quelque chose de normal:

    La déclaration anticipée ne sert que pour te permettre de déclarer un pointeur ou une référence vers un objet du type de la classe, mais tu as besoin de la définition de celle-ci pour pouvoir... accéder à son interface publique.

    Or, un type imbriqué nécessite... de pouvoir accéder au type dans lequel il est imbriqué:

    Si le type imbriqué était nommé iterator ou const_iterator (par exemple), tu l'utiliserais pour... déclarer une variable de type iterator ou const_iterator afin... de manipuler le contenu d'un objet (même s'il est déclaré sous forme de référence ou de pointeur) du type dans lequel iterator ou const_iterator est imbriqué.

    Il faut comprendre que la déclaration anticipée ne permet que d'éviter l'inclusion circulaire (le fait que A.h inclue B.h qui inclut lui-même A.h, de manière directe ou indirecte).

    Par contre, dans le fichier d'implémentation (*.cpp), il faudra néanmoins inclure le fichier d'en-tête de la classe déclarée anticipativiement afin de pouvoir... accéder à son interface publique, sous peine soit d'avoir une plainte du compilateur parce que "telle ou telle fonction n'existe pas", soit d'avoir une plainte de lui parce que "tu utilise une classe qui n'est pas complètement définie et pour laquelle tu n'a qu'une déclaration anticipée" (sur un delete ptr par exemple)
    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

  7. #7
    Invité
    Invité(e)
    Par défaut
    Merci pour votre aide, sujet résolu.

Discussions similaires

  1. Réponses: 7
    Dernier message: 26/03/2013, 13h07
  2. Réponses: 7
    Dernier message: 11/08/2011, 19h29
  3. Ne reconnait pas une classe dans un namespace
    Par laurent12345 dans le forum ASP.NET
    Réponses: 0
    Dernier message: 20/05/2010, 17h50
  4. Réponses: 0
    Dernier message: 18/05/2010, 22h19
  5. Réponses: 4
    Dernier message: 16/03/2009, 22h57

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