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 :

Probleme de forward declaration


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé

    Profil pro
    Inscrit en
    Avril 2005
    Messages
    162
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 162
    Par défaut Probleme de forward declaration
    Voila, pour eviter un include, je veux faire une forward declaration.
    Le probleme c'est que ca concerne une nested class :

    class A;
    class A::B; // compil error : expected type-name

    void myFunction(const A::B&);

    Comment faire pour bien ecrire une predeclaration d'une classe imbriquee ?

  2. #2
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2006
    Messages : 366
    Par défaut
    Tu ne peux pas. A partir du moment où tu essayes d'accéder à un champ/type/fonction d'une classe A, il faut que celle-ci ait été définie. Donc nécessité d'un #include.

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

    Par contre, rien ne t'empêche normalement de faire une déclaration anticipée de ta classe imbriquée:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    class A;
    class A::B;
     
    void MaFonction(/*const*/ A::B&);
    (attention: la déclaration imbriquée de B doit être effectuée dans la partie publique de A )
    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 éclairé

    Profil pro
    Inscrit en
    Avril 2005
    Messages
    162
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 162
    Par défaut
    Citation Envoyé par koala01 Voir le message
    Salut,

    Par contre, rien ne t'empêche normalement de faire une déclaration anticipée de ta classe imbriquée:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    class A;
    class A::B;
     
    void MaFonction(/*const*/ A::B&);
    (attention: la déclaration imbriquée de B doit être effectuée dans la partie publique de A )
    Ben, c'est exactement ce que j'ai fait.
    Et B est bien publique dans A

  5. #5
    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
    Je viens de vérifier... la déclaration anticipée ne fonctionne effectivement pas dans le cadre d'un classe imbriquée. Au temps pour moi

    Ceci dit, tu n'évitera pas l'include à un moment où un autre, même dans le cas où une déclaration anticipée apparait

    Dés le moment où tu veux utiliser une structure définie, il n'y a rien à faire, il faut que l'unité de compilation dispose de... la définition réelle de cette structure:
    • pour en connaître les noms des différents membres
    • pour en connaître les noms des différentes méthodes
    • pour en connaître la taille

    Tu ne peux d'ailleurs envisager sereinement la déclaration anticipée que si tu n'a pas besoin du type complet avant qu'il n'apparaisse.

    Ainsi, un code du genre de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    #ifndef A_H
    #define A_H
    class B;
     
    class A
    {
        public:
            A(B&);
            virtual ~A();
            const B GetAsB();
        protected:
        private:
            int v;
    };
    #endif // A_H
    fonctionnera avec un fichier d'implémentation sous la forme de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    #include "A.h"
    #include "B.h"
     
    A::A(B& b):v(b.GetVal())
    {
     
    }
    A::~A()
    {
     
    }
    const B A::GetAsB()
    {
        return B(v);
    }
    (sous réserve, évidemment, de l'existence du fichier B.h) alors qu'une classe du genre de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    class A
    {
        public:
            explicit A(const B&);
            ~A();
        private:
            B b; 
    };
    nécessitera de connaître la définition complète de B pour être en mesure de créer la classe A.

    Il s'en suit qu'il faudra soit inclure B.h avant de définir la classe A, soit définir les deux classes dans le même fichier, mais en définissant B avant A

    [EDIT]Par contre, la taille d'un pointeur étant d'office connue, rien ne t'empêcherait de prévoir une classe sous la forme de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    class B;
    class A
    {
        public:
            A(B*);
            ~B();
        private:
            B* b;
    };
    et de ne prévoir la définition complète de la classe B qu'après la classe A (ou via inclusion de B.h dans le fichier d'implémentation)

    Mais, quoi qu'il en soit, il semble raisonnable d'envisager le fait que tu auras de toutes façons besoin de connaître l'intégralité de la classe B pour implémenter les différentes méthodes de la classe A
    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

  6. #6
    Membre émérite
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 064
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 064
    Par défaut
    Faudrait déja savoir pour quelle raison tu veux déclarer ta fonction avant de définir ta classe, je n'en vois du tout l'utilité.
    D'après mon expérience, je dirais que les déclarations anticipées ne sont utiles que dans le cas d'interdépendance entre des classes (notamment avec les classes amies), et aussi qu'il vaut vraiment mieux les déclarer dans le même header (j'ai déja passé des heures à essayer de trouver un barème quelconque pour les dépendances inter-fichiers, j'ai fini par laisser tomber).

Discussions similaires

  1. Probleme de forward declaration
    Par crazycrow dans le forum Langage
    Réponses: 4
    Dernier message: 28/05/2009, 10h21
  2. Probleme de forward declaration
    Par vandamme dans le forum Bibliothèques
    Réponses: 0
    Dernier message: 05/10/2007, 18h16
  3. Probleme de forward declaration
    Par porco dans le forum C++
    Réponses: 2
    Dernier message: 15/10/2006, 17h15
  4. [struts]probleme de forward
    Par VincentP dans le forum Struts 1
    Réponses: 4
    Dernier message: 15/09/2005, 14h42
  5. Réponses: 5
    Dernier message: 10/11/2004, 17h23

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