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 :

Classes Relations Aide


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    371
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 371
    Par défaut Classes Relations Aide
    Bonjour ,

    Voila , jai un petit probleme , je ne sais pas comment faire , meme en ayant chercher auparavant

    Donc voila j'ai une classe A et une classe B et une classe C

    La classe A crée un tableau d'instance de B , et chaque instance de B crée une instance C.

    Les 3 classes sont en faites reliées par composition à ce moment là.

    Je veux en fait que C puisse voir B ... et ainsi executer des methodes de B.

    Toutes les instances ont été par des new.


    Donc ce que je voulais faire , c'est faire un getmonB dans A mais C ne pourra pas executer cette methode vu quil ne voit pas A ....


    Please , jai vraiment besoin de votre aide.

    cordialement

  2. #2
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Par défaut
    Salut,

    Peut-être que ce sujet un peu voisin pourrait t'aider ?

    MAT.

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    371
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 371
    Par défaut
    Non car se n'est pas le meme genre de probleme

  4. #4
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Par défaut
    Citation Envoyé par Pugebad Voir le message
    Non car se n'est pas le meme genre de probleme
    Ils sont un peu cousins quand même...

    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
    class B;
     
    class C
    {
    public:
      explicit C( B& b ) : b_( b ) {}
     
    private:
      C( const C& );
      C& operator=( const C& );
     
    private:
      B& b_;
    };
     
    class B
    {
    public:
      B() : c_( new C( *this ) ) {}
     ~B() { delete c_; }
     
    private:
      B( const B& );
      B& operator=( const B& );
     
      C* c_;
    };
    MAT.

  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
    Salut,

    Tu pourrais envisager un truc 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
    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
    52
    53
    54
    55
    56
    57
    class B;
    class C;
    class A
    {
        public:
            A(/*arguments éventuels */){}
            ~A()
            {
                 for(size_t i=0;i<btab.size();i++)
                     delete btab[i];
            }
             void addB(/*arguments éventuels */)
             {
                  btab.push_back(new B(/*arguments éventuels*/);
             }
             size_t size() const
             {
                  return btab.size();
             }
             void erase(size_t ind)
             {
                   delete btab[ind];
                   btab.erease(btab.betin+ind);
             }
             void clear()
             {
                 for(size_t i=0;i<btab.size();i++)
                     delete btab[i];
             }
             B& operator[](size_t ind)
             {
                 return *(btab[ind]);
             }
             /* autres méthodes */
        private:
            std::vector<B*> btab;
    };
    class B
    {
        public:
            B(/*arguments éventuels*/):child(this
                                    /*,autres arguments éventuels*/){}
            ~B(){}
            /* autres méthodes */
            C& child(){return child;}
        private: 
            C child;
    }
    class C
    {
        public:
            C(B* pparent/*,autres arguments éventuels*/):pparent(pparent){}
            ~C(){}
            B& parent(){return *pparent;}
        private:
            B* pparent;
    };
    [EDIT] n'oublie pas de rendre ta classe A non copiable pour éviter les problèmes :p
    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 Expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Par défaut
    Histoire d'être complet, je tenais à dire que ce type de référence circulaire (puisqu'il s'agit de ça (B -> C -> B)) est à éviter. C'est souvent le signe d'un problème dans l'architecture logicielle (par exemple, B a plus d'une responsabilité; dans ce cas, mieux vaut casser B en deux classes B et B'; C et B se servent des services de B' et voilà - le tour est joué; enfin, encore faut-il que B' ait une sémantique propre).

    La solution correcte consiste donc à revoir l'architecture logicielle - plus exactement la partie qui concerne la relation entre les classes A, B et C.
    • vérifier que A, B et C n'ont qu'une responsabilité (respect du principe de responsabilité unique)
    • vérifier si les dépendances ne sont pas due à la publication de détails d'implémentation dans les interfaces des classes (respect du principe d'inversion de dépendance).

    Les cas ou les références circulaires sont obligatoires en C++ sont extrêmement rares. A l'heure actuelle, je n'ai vu que deux cas particuliers : l'implémentation du pattern visiteur tel que décrit dans le GoF (l'autre possibilité est décrite par RC Martin, qui propose un visiteur acyclique; celui-ci souffre d'autres défauts - il est à la limite de ne pas respecter le principe ouvert/fermé), et l'implémentation de shared_prt en relation avec weak_ptr (dans boost et dans le TR1). Dans le premier cas le problème est le langage lui même (pas de double dispatch natif, il doit donc être émulé); dans le second cas, c'est un parti pris au niveau de l'architecture, de manière à pouvoir créer un shared_ptr à partir d'un weak_ptr et vice-versa.

    Tous les autres cas que j'ai vu abuse des fonctionnalités offertes par le langage et pourraient être mieux designés.
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

Discussions similaires

  1. ce diagramme de classe, correct? [aide pour PFE]
    Par hamzawii dans le forum UML
    Réponses: 4
    Dernier message: 30/05/2011, 12h00
  2. Classe Date - AIDE
    Par btakeshi dans le forum C++
    Réponses: 2
    Dernier message: 20/12/2010, 20h21
  3. diagramme de classe: relation vers même classe
    Par yasinfo dans le forum BOUML
    Réponses: 2
    Dernier message: 14/09/2008, 22h04
  4. Diagramme de classes - Relation client / serveur
    Par gronk dans le forum Diagrammes de Classes
    Réponses: 3
    Dernier message: 01/03/2007, 13h42
  5. Réponses: 5
    Dernier message: 10/11/2004, 19h44

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