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 :

Recheche d'un exemple d'aggrégation et un de composition


Sujet :

C++

  1. #1
    Nouveau membre du Club
    Inscrit en
    Janvier 2004
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 49
    Points : 25
    Points
    25
    Par défaut Recheche d'un exemple d'aggrégation et un de composition
    Bonjour tt le monde,

    Je voudrais avoir un exemple concret de composition (différent de l'aggrégation), qui par définition veut dire q'une classe est contient une autre (alors que pour l'aggrégation, une classe est composée d'une ou plusieurs autres classe, voir exemple à l'url :http://emmanuel-remy.developpez.com/...agregation.htm).

    Merci de baser l'exemple de la composition sur celui de l'aggrégattion donnée par Emmanuel-Remy à l'url ci-dessus. Cependant ce dernier semble penser qu'une composition et une aggrégation sont la même chose, ce qui est n'est pas vrai.

    D'avance merci pour votre aide.

    Icetechnik

  2. #2
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Salut

    Il me semble que tu t'embrouilles un peu, tu dis que l'aggrégation (une classe composée d'une autre) est différente de la composition. Bref pour moi c'est la même chose.

    Par contre il faut faire la différence entre aggrégation forte (= composition, cf. l'exemple du cercle et du point dans l'article) et aggrégation faible (typiquement en C++, un lien par pointeur ou référerence). Dans le cas de l'aggrégation faible, ce n'est pas l'objet aggrégeant qui gère la durée de vie de l'objet aggrégé.

    Ce sont des souvenirs de mon cours d'UML / C++, peut-être que quelqu'un a une autre interprétation.

  3. #3
    Rédacteur
    Avatar de bigboomshakala
    Homme Profil pro
    Consultant Web .NET
    Inscrit en
    Avril 2004
    Messages
    2 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant Web .NET
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2004
    Messages : 2 077
    Points : 2 757
    Points
    2 757
    Par défaut
    1. Agrégation



      * L'agrégation est une association non symétrique, qui exprime un couplage fort et une relation de subordination.
      Elle représente une relation de type "ensemble / élément".

      * UML ne définit pas ce qu'est une relation de type "ensemble / élément", mais il permet cependant d'exprimer cette vue subjective de manière explicite.

      * Une agrégation peut notamment (mais pas nécessairement) exprimer :
      o qu'une classe (un "élément") fait partie d'une autre ("l'agrégat"),
      o qu'un changement d'état d'une classe, entraîne un changement d'état d'une autre,
      o qu'une action sur une classe, entraîne une action sur une autre.

      * A un même moment, une instance d'élément agrégé peut être liée à plusieurs instances d'autres classes (l'élément agrégé peut être partagé).

      * Une instance d'élément agrégé peut exister sans agrégat (et inversement) : les cycles de vies de l'agrégat et de ses éléments agrégés peuvent être indépendants.



    1. Composition



      * La composition est une agrégation forte (agrégation par valeur).

      * Les cycles de vies des éléments (les "composants") et de l'agrégat sont liés : si l'agrégat est détruit (ou copié), ses composants le sont aussi.

      * A un même moment, une instance de composant ne peut être liée qu'à un seul agrégat.

      * Les "objets composites" sont des instances de classes composées.

  4. #4
    Nouveau membre du Club
    Inscrit en
    Janvier 2004
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 49
    Points : 25
    Points
    25
    Par défaut
    Serait il possible d'avoir un exemple d'aggrégation basé sur celui de la composition forte qui est au lien : http://emmanuel-remy.developpez.com/...agregation.htm?

    D'avance merci.

  5. #5
    Nouveau membre du Club
    Inscrit en
    Janvier 2004
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 49
    Points : 25
    Points
    25
    Par défaut
    aggrégation faible (typiquement en C++, un lien par pointeur ou référerence)
    .

    Je voudrais donc savoir ci le code ci-dessous est un exemple d'aggrégation faible(c'est à dire avec le terme couramment emploiyé une aggrégation et non une composition).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    class Point
    {
       int x, y;
    public:
      void deplace(int dx, int dy) {x+= dx; y=+=dy;}
     
    Point () {}//Constructeur par défaut
    ~Point(){}
    Point(const Point& p){x=p.x;  y=p.y;}
    Point& operator= (const Point& p){x=p.x;  y=p.y;}
    };
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    class Cercle
    {
       Point* centre;
       unsigned rayon;
    public:
       void deplace(int dx, int dy) {(*centre).deplace (dx, dy);}
       Cercle(const Cercle& c) {(*centre) = c.centre; rayon=c.rayon;}
       Cercle& operator= (const Cercle& c)  {(*centre)= c.centre; rayon=c.rayon;}
    };

  6. #6
    Nouveau membre du Club
    Inscrit en
    Janvier 2004
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 49
    Points : 25
    Points
    25
    Par défaut Corrigé du code ci-dessus
    Voici le code corrigé mais avec un message d'erreur en output(
    (
    Composition_Agregation.cpp(44) : fatal error C1004: unexpected end of file found
    Error executing cl.exe.

    Composition_Agregation.exe - 1 error(s), 0 warning(s)
    )

    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
    class Point 
    { 
       int x, y; 
    public: 
      void deplace(int dx, int dy) {x+= dx; y+=dy;} 
     
    Point (int x=10, int y=20) {}//Constructeur par défaut 
    ~Point(){} 
    Point(const Point& p){x=p.x;  y=p.y;} 
    Point& operator= (const Point& p){x=p.x;  y=p.y;} 
    }; 
     
     
    class Cercle 
    { 
       Point* centre; 
       unsigned rayon; 
    public: 
       void deplace(int dx, int dy) {(*centre).deplace (dx, dy);} 
       Cercle(){Point* p=point(0,1), unsigned r=0){}
       Cercle(const Cercle& c) {(*this).centre = c.centre; rayon=c.rayon;} 
       Cercle& operator= (const Cercle& c)  {(*this).centre = c.centre; rayon = c.rayon;} 
    };
     
    int main()
    {   
        Point p1(10, 20);
     
        Cercle c1, c2;
    	c1.centre = &p1;
     
    	Cercle c3 = c1;
     
    	c1 = c2;
     
    	c1.deplace(-5, 3);
     
        return 0;
    }

  7. #7
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 275
    Points : 10 985
    Points
    10 985
    Par défaut
    Possiblement un problème d'en-têtes précompilés avec VC++.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  8. #8
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 275
    Points : 10 985
    Points
    10 985
    Par défaut
    Et il faut attendre que tu corriges les problèmes de gestion de la mémoire que tu va rencontrer avec ce code pour que l'on puisse te dire à quelle catégorie il va appartenir. Pour l'instant, cela se situerait (si je prends les def de bigboomshakala) entre la simple aggrégation et le lien, mais ce n'est aucun des deux, le code est incorrect.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  9. #9
    Nouveau membre du Club
    Inscrit en
    Janvier 2004
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 49
    Points : 25
    Points
    25
    Par défaut
    En effet, à l'éxécution, j'obtiens le message d'erreur :
    0xc0000005:Access Violation
    Revoici le code "corrigé" :

    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
    class Point 
    { 
       int x, y; 
    public: 
      void deplace(int dx, int dy) {x+= dx; y+=dy;} 
     
    Point (int x=10, int y=20) {}//Constructeur par défaut 
    ~Point(){} 
    Point(const Point& p){x=p.x;  y=p.y;} 
    Point& operator= (const Point& p){x=p.x;  y=p.y;} 
    }; 
     
     
    class Cercle 
    { 
       Point* centre; 
       unsigned rayon; 
    public: 
       void deplace(int dx, int dy) {(*centre).deplace (dx, dy);} 
       Cercle(Point* p=&Point(0,1), unsigned r=0){}
       Cercle(const Cercle& c) {(*this).centre = c.centre; rayon=c.rayon;} 
       Cercle& operator= (const Cercle& c)  
       {
    	   (*this).centre = c.centre; rayon = c.rayon;
           return *this;
       } 
       void affect(Point* p){(*this).centre=p;}
    };
     
    int main()
    {   
        Point p1(10, 20);
     
        Cercle c1, c2;
    	c1.affect(&p1);
     
    	Cercle c3 = c1;
     
    	Point p2;
    	c1 = c2;
     
    	c1.deplace(-5, 3);
     
        return 0;
    }
    Je commence à me mélanger les pinceaux...

  10. #10
    Membre averti
    Avatar de rolkA
    Inscrit en
    Juillet 2003
    Messages
    324
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 324
    Points : 369
    Points
    369
    Par défaut
    Bref, tu veux savoir quoi ?
    Etant donné que ton centre nait à la naissance du cercle, et meurt à la mort du cercle, c'est de la vraie composition pour moi, de l'agrégation forte donc.

    L'agrégation faible peut être utilisée pour une voiture par exemple: si la voiture explose, les pneus peuvent très bien rester en vie.
    Un historique local pour Visual Studio 2005 et 2008 :
    http://www.codeplex.com/VLH2005

  11. #11
    Nouveau membre du Club
    Inscrit en
    Janvier 2004
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 49
    Points : 25
    Points
    25
    Par défaut
    En bref, je voudrais savoir comment on écrirait le code ci-dessous qui n'utilise l'aggrégation en forte en un code n'utilisant que l'aggrégation faible.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    class Point 
    { 
       int x, y; 
    public: 
      void deplace(int dx, int dy) {x+= dx; y+=dy;} 
     
    Point () {}//Constructeur par défaut 
    ~Point(){} 
    Point(const Point& p){x=p.x;  y=p.y;} 
    Point& operator= (const Point& p){x=p.x;  y=p.y;} 
    };
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    class Cercle 
    { 
       Point centre; 
       unsigned rayon; 
    public: 
       void deplace(int dx, int dy) {centre.deplace (dx, dy);} 
       Cercle(const Cercle& c) {centre = c.centre; rayon=c.rayon;} 
       Cercle& operator= (const Cercle& c)  {centre= c.centre; rayon=c.rayon;} 
    };

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    int main() 
    {    
       Cercle c1, c2; 
     
       Cercle c3 = c1; 
     
       c1 = c2; 
     
       c1.deplace(-5, 3); 
     
        return 0; 
    }

  12. #12
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Là on parle de conception, pas de C++. Tu ne pourras pas transformer une aggrégation forte en aggrégation faible simplement en rajoutant un pointeur quelque part.

    Là tu codes un cercle caractérisé par un centre (point) -> aggrégation forte, quelque soit la manière dont tu vas le coder. Une aggrégation faible n'aurait pas de sens dans ce contexte.

    Si tu précisais plutôt le fond de ta question ?

  13. #13
    Nouveau membre du Club
    Inscrit en
    Janvier 2004
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 49
    Points : 25
    Points
    25
    Par défaut
    En fait, je cherche un exemple concret (avec étude des durées de chaque élément contenu par rapport au contenant).

    Donc, par exemple une classe Pointille (voir ci-dessous) contenant plusieurs Point serait défini par aggrégation faible et non par aggregation.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    class Pointille
    {
       private:
       stack<Point*> stockpoint;
     
       public:
       void BuildPoint()
      {
        Point * point=new Point ();
        stockpoint.push(point);
       ...
       }
    };

  14. #14
    Nouveau membre du Club
    Inscrit en
    Janvier 2004
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 49
    Points : 25
    Points
    25
    Par défaut
    Donc, par exemple une classe Pointille (voir ci-dessous) contenant plusieurs Point serait défini par aggrégation faible et non par aggregation.
    Il faut lire :

    Donc, par exemple une classe Pointille (voir ci-dessous) contenant plusieurs Point serait défini par aggrégation faible et non par aggregation forte.

  15. #15
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Ca pourrait être un exemple, oui (quoique, on peut pinailler : une classe pointille devrait en toute logique construire ses points une fois pour toute lorsqu'on l'instancie, et les détruire avec elle).

    Un très bon exemple serait les pointeurs intelligents à base de comptage de référence : ils ont bien la charge d'une ressource, mais ne devront pas la détruire lorsqu'ils mourront car d'autres instances pourront pointer sur celle-ci. De même qu'on peut réaffecter à un pointeur intelligent plusieurs ressources durant sa durée de vie.

  16. #16
    Nouveau membre du Club
    Inscrit en
    Janvier 2004
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 49
    Points : 25
    Points
    25
    Par défaut
    Ah, Ok...enfin je comprends mieux.

    Je vais essayé de me trouver le code d'un smart_pointeur.

    Merci à tous pour votre aide.

Discussions similaires

  1. recheche des exemples en JADE
    Par kinfo dans le forum Programmation par agent
    Réponses: 0
    Dernier message: 23/12/2009, 00h05
  2. recheche des exemples en JADE
    Par kinfo dans le forum Débuter avec Java
    Réponses: 0
    Dernier message: 23/12/2009, 00h05
  3. [VB6] Lancer un service, par exemple Sql Server
    Par fea dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 16/10/2002, 14h07
  4. recherche exemple simple pour corba en c++
    Par Pinggui dans le forum CORBA
    Réponses: 4
    Dernier message: 06/05/2002, 11h29

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