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 :

appel mutuel entre classe et structure


Sujet :

C++

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2011
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 35
    Points : 28
    Points
    28
    Par défaut appel mutuel entre classe et structure
    Bonjour,

    J'ai un dessin (classe) qui peut contenir d'autres dessins (structure).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    class Dessin
     {
     private :
     public :
       vector<sDessin> vec_dessin_en_plus;
     };
     
    struct sDessin
     {
     float rotation;
     Coordinate* position;
     Dessin* dessin_en_plus;
     }
    Mon problème est de savoir où déclarer la structure.
    si je la déclare avant la classe, le compilateur me dira que Dessin n'est pas déclaré.
    si je la déclare après la classe, le compilateur me dira que sDessin n'est pas déclaré.

    S'il y à une autre façon de procéder pour aboutir au même résultat je suis preneur aussi mais n'ayant pas programmé en C++ depuis longtemps, je n'ai plus trop les possibilités en tête.
    Merci d'avance.

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Comme ceci avec une déclaration anticipée de Dessin :
    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
    class Dessin;
     
    struct sDessin
    {
        float rotation;
        Coordinate* position;
        Dessin* dessin_en_plus;
    }
     
    class Dessin
    {
    private :
    public :
        vector<sDessin> vec_dessin_en_plus;
    };
    Voir la FAQ Comment créer 2 classes qui font référence l'une à l'autre ?

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2011
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 35
    Points : 28
    Points
    28
    Par défaut
    Merci de cette réponse rapide.

  4. #4
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    tech lead c++ linux
    Inscrit en
    Août 2004
    Messages
    4 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : tech lead c++ linux

    Informations forums :
    Inscription : Août 2004
    Messages : 4 262
    Points : 6 680
    Points
    6 680
    Billets dans le blog
    2
    Par défaut
    Bonjour,

    je voulais juste faire remarquer qu'il y a quelques soucis dans cette construction: il y a plusieurs ambiguïtés.
    Le c++ s'est construit sur une philosophie dite de "service": chaque classe rend un service. Le nom d'une classe correspond au service qu'elle rend.
    Dans ta construction, il y a deux ambiguïtés:
    1. Quelles est la différence, en terme de service rendu, entre Dessin et sDessin?
    2. Telle que tu nous présente ce code, le service rendu par ces deux classes est juste de contenir des données. Dans ce cas, les valeurs 'position' et 'rotation' n'ont rien à faire là, puisque ces données ne concernent que la classe qui aura le rôle (qui fournira le service) de manipuler (afficher, sérialiser, ...) ces images.
    « L'effort par lequel toute chose tend à persévérer dans son être n'est rien de plus que l'essence actuelle de cette chose. »
    Spinoza — Éthique III, Proposition VII

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2011
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 35
    Points : 28
    Points
    28
    Par défaut
    Bonjour,

    La sDessin permet de pouvoir avoir un dessin contenu dans un autre. En gros, j'ai un dessin A qui représente le corps d'un personnage. Pour ne pas avoir à le redessiner plusieurs fois, quand je dessine une tête je rajoute le dessin du corps avec une position et une orientation propre à la position de la tête.
    Normalement le principe est utilisé pour des composants électroniques mais là j'ai utilisé des dessins pour l'exemple.

    La ligne
    Permet bien d'obtenir une compilation sans erreur, par contre si ma structure de compose ainsi,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    struct sDessin
     {
     float rotation;
     Coordinate* position;
     Dessin dessin_en_plus;
     }
    le compilateur me dit que "Dessin" est incomplet.
    Seul un pointeur peut être créé et non un objet complet grâce à la déclaration anticipée ?

  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Oui, la forward declaration permet de déclarer pointeur et référence.

    Remercie le compilateur pour une telle erreur, parce que imagine le cas inverse:
    - dessin contient un sDessin
    > à chaque création de dessin, on crée un sDessin
    - sDessin contient un dessin
    > à chaque création de sDessin, on crée un dessin

    à la première allocation de l'un ou l'autre, ton pc explose
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2011
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 35
    Points : 28
    Points
    28
    Par défaut
    Oui merci, mais ce que je veux savoir c'est si l'erreur à la compilation est dû à mon encapsulation ou à la déclaration anticipée ?

  8. #8
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    tech lead c++ linux
    Inscrit en
    Août 2004
    Messages
    4 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : tech lead c++ linux

    Informations forums :
    Inscription : Août 2004
    Messages : 4 262
    Points : 6 680
    Points
    6 680
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par allbundy Voir le message
    Oui merci, mais ce que je veux savoir c'est si l'erreur à la compilation est dû à mon encapsulation ou à la déclaration anticipée ?
    Les deux mon capitaine

    Avant toute chose, il faut clarifier une chose:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    class sDessin
    {
       Dessin dessin;
       Dessin * p_dessin;
       Dessin & ref_dessin;
    };
    Dans le code ci-dessus, la variable membre dessin est de type Dessin, la variable membre p_dessin est du type pointeur (un pointeur est un type particulier qui contient, entre autres, l'adresse de la variable pointée), et ref_dessin est de type référence.

    Maintenant prenons le code suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    struct sDessin
    {
       Dessin * p_dessin;
    };
    avec le code ci-dessus, lorsque du définit la structure sDessin, il a besoin de connaître la taille de p_dessin. Or p_dessin est un pointeur, donc sa taille est connue. De même, dans le code suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    struct sDessin
    {
       Dessin dessin;
    };
    il a besoin de connaître la taille de dessin. Or dessin est de type Dessin, il doit donc connaître la taille de la classe Dessin. Or, la déclaration anticipée ne lui suffit pas pour connaître la taille d'une classe, il a besoin de tout savoir.
    « L'effort par lequel toute chose tend à persévérer dans son être n'est rien de plus que l'essence actuelle de cette chose. »
    Spinoza — Éthique III, Proposition VII

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2011
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 35
    Points : 28
    Points
    28
    Par défaut
    Merci pour ces infos, cela confirme mes pensées.

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

Discussions similaires

  1. Imbrication de JPanel / Appel entre classe
    Par martyrom dans le forum AWT/Swing
    Réponses: 3
    Dernier message: 27/03/2012, 16h40
  2. appel entre class en java
    Par cesear89 dans le forum NetBeans
    Réponses: 16
    Dernier message: 07/11/2010, 01h34
  3. Appel de Fonction entre classes
    Par likenoother dans le forum C++
    Réponses: 5
    Dernier message: 09/08/2006, 14h37
  4. [PL/SQL]Appel d'une classe/méthode java
    Par marsup54 dans le forum SQL
    Réponses: 4
    Dernier message: 30/06/2004, 16h44
  5. Lien entre les vues 'Structure' et l'éditeur
    Par Tifauv' dans le forum Eclipse Platform
    Réponses: 3
    Dernier message: 13/05/2004, 16h06

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