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 :

Inter dependance Classes


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Corrèze (Limousin)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 7
    Par défaut Inter dependance Classes
    Je galere dans mon application qui contient deux classes A et B interdependantes.

    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    class A;
    class B;
     
    A *IA;
    B *IB;
     
    class A
    { 
        //(...)
        void FuncA()
        {
            //(...)
            IB->FuncB();
        }
     
        void FuncB()
        {
            //(...)
        }
    }
     
    class B
    {
        //(...)
     
        void FuncA()
        {
            IA->FuncB();
        }
     
        void FuncB()
        {
            //(...)
        }
    }
    J'obtiens le message d'erreur: FuncB is not member of B, because the type is not yet defined.
    Si j'inverse l'ordre des definitions des classes A et B jobtiens le meme message mais pour la class A.

    J'ai essayé de prototyper les fonctions membres dans un fichier header mais j'ai le message: FuncA is not member of A, FuncB is not member of ...

    Je sais plus quoi faire

  2. #2
    Membre Expert Avatar de Trademark
    Profil pro
    Inscrit en
    Février 2009
    Messages
    762
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 762
    Par défaut
    Faites des forward declarations. Voir la faq.

    Mais j'avais mal lu votre code. Essayez ça (sortir la déclaration des méthodes de la classe) :

    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    #include <iostream>
     
    class B;
    class A;
     
    A *IA;
    B *IB;
     
    class A
    {
        public: 
        //(...)
        void FuncA();
     
        void FuncB()
        {
          std::cout << "Objet A" << std::endl;
        }
    };
     
    class B
    {
        public:
        //(...)
     
        void FuncA();
     
        void FuncB()
        {
          std::cout << "Objet B" << std::endl;
        }
    };
     
    void A::FuncA()
    {
      IB->FuncB();
    }
     
    void B::FuncA()
    {
      IA->FuncB();
    }
     
    int main()
    {
      IA = new A();
      IB = new B();
      IA->FuncA();
      IB->FuncA();
      return 0;
    }
    Ça marche chez moi

  3. #3
    screetch
    Invité(e)
    Par défaut
    Elles y sont déjà, les forward declaration

    le problème c'est que en plus de la forward declaration tu as besoin de la declaration complète; A a une dependance forte sur B et de même, B a une dépendance forte sur A dans leurs implémentations.


    Pour faire vite, il y a 3 phases pour une classe;
    * la forward declaration (dit au compilateur: la classe existe)
    * la declaration (dit au compilateur: la classe existe, voila ce qu'elle sait faire)
    * la définition (dit au compilateur: voila comment elle le fait)

    or toi tu as mis l'implémentation dans la déclaration; l'implémentation de A dépend de la declaration de B et l'implémentation de B depend de la declaration de A.

    Pour que ca marche, tu devrais avoir d'abord la declaration de A et de B, puis l'implémentation de A et de B.
    il te faudra donc séparer la declaration et l'implémentation. Met le code des méthodes dans un fichier séparé, de sorte que les declarations de A et B puissent intervenir avant.

  4. #4
    Membre Expert Avatar de Trademark
    Profil pro
    Inscrit en
    Février 2009
    Messages
    762
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 762
    Par défaut
    Je viens d'éditer à l'instant, je me suis rendu compte de ma bétise juste après avoir posté

  5. #5
    Membre Expert

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2004
    Messages
    1 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Doubs (Franche Comté)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 1 391
    Par défaut
    Citation Envoyé par screetch Voir le message
    Pour faire vite, il y a 3 phases pour une classe;
    * la forward declaration (dit au compilateur: la classe existe)
    * la declaration (dit au compilateur: la classe existe, voila ce qu'elle sait faire)
    * la définition (dit au compilateur: voila comment elle le fait)
    Pour compléter, une forward declaration n'est qu'un "genre" de déclaration (*).

    Le second point est en fait la définition de la classe, elle définie l'interface de celle-ci (en particulier elle déclare la liste des données et fonctions membres).

    Le troisième point que tu cites n'est pas la définition de la classe, mais les définitions des fonctions "liée" à la classe.

    Sinon +1 pour la séparation header/implémantation.

    (*) La syntaxe class class-name; est la syntaxe de déclaration d'une classe nommé class-name, selon la situation c'est nommé une forward declaration ou une redéclaration (même système que le masquage des fonctions).

    La syntaxe class class-name {}; est une définition (on pourrait dire définition-déclarante si la classe n'a pas été déclarée avant), de la même manière que type-name data; dans une fonction.

  6. #6
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Corrèze (Limousin)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 7
    Par défaut
    Merci pour vtre aide
    J'ai mis les declarations dans un fichier apart puis definis les fonctions ca marche nickel.
    grace a vous je peux enfin continuer.

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 15/03/2010, 21h32
  2. Dependence entre class Java
    Par Soulama dans le forum Général Java
    Réponses: 1
    Dernier message: 14/04/2009, 12h20
  3. Référence inter-classe ex ou implicite ?
    Par peter27x dans le forum Débuter
    Réponses: 3
    Dernier message: 29/01/2009, 13h55
  4. [NB 5.5][Plateforme] dependances inter modules
    Par bulbo dans le forum NetBeans
    Réponses: 6
    Dernier message: 10/08/2007, 08h59
  5. fonctions inter- classes
    Par THE_VIP dans le forum Général Python
    Réponses: 5
    Dernier message: 12/08/2006, 00h51

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