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 :

Agrégation: statique ou dynamique


Sujet :

C++

  1. #1
    Membre averti Avatar de icer
    Inscrit en
    Janvier 2006
    Messages
    332
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 332
    Points : 363
    Points
    363
    Par défaut Agrégation: statique ou dynamique
    En c++ il existe deux moyens de céer des objets, en statique ou dynamique.
    Si on a besoin d'un objet qui est composé d'autres objets, que doit-on choisir?
    Les membres de notre classe doivent-elle être statique:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    // une classe point
    class point
    {
       float x;
       float y;
    };
    // une classe ligne composée de 2 points
    class ligne
    {
        point p1;
        point p2;
    };
    Ou dynamique (utilisation de pointeur):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    // une classe point
    class point
    {
       float x;
       float y;
    };
    // une classe ligne composée de 2 points
    class ligne
    {
        point* p1;
        point* p2;
    };
    Quels seraient les avantages ou les inconvénients de ces deux méthodes?
    Vos avis m' intéresse.

  2. #2
    Membre Expert

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Points : 5 723
    Points
    5 723
    Par défaut
    Pour ton exemple, si on sait qu'une ligne est composé de deux points pas plus pas moins alors on prendra du statique. Le dynamique serait utilise si tu ne connaissait pas à l'avance le nombre de point que tu as dans ta class (et encore avec des conteneurs on pourrait aisément s'en passer)

  3. #3
    Membre averti Avatar de icer
    Inscrit en
    Janvier 2006
    Messages
    332
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 332
    Points : 363
    Points
    363
    Par défaut
    Citation Envoyé par hegros
    (et encore avec des conteneurs on pourrait aisément s'en passer)
    Je ne sais pas ce que c'est qu'un conteneur. Tu pourais me donner une définition ou un lien vers de la doc?

  4. #4
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    Tu as rarement besoin des pointeurs en C++

  5. #5
    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
    Citation Envoyé par icer
    Citation Envoyé par hegros
    (et encore avec des conteneurs on pourrait aisément s'en passer)
    Je ne sais pas ce que c'est qu'un conteneur. Tu pourais me donner une définition ou un lien vers de la doc?
    cf. STL : vector, list, deque...

  6. #6
    Membre averti Avatar de icer
    Inscrit en
    Janvier 2006
    Messages
    332
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 332
    Points : 363
    Points
    363
    Par défaut
    Citation Envoyé par loufoque
    Tu as rarement besoin des pointeurs en C++
    Si j'ai bien compris pour créer des objets dynamiquement, le mieux est d'utiliser des conteneurs. De même pour l'agrégation!
    Merci pour le lien bigboomshakala!
    Je ne n'ai plus qu'a retourner à la doc...

  7. #7
    Membre habitué Avatar de BigNic
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    195
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2004
    Messages : 195
    Points : 154
    Points
    154
    Par défaut
    Si j'ai bien compris pour créer des objets dynamiquement, le mieux est d'utiliser des conteneurs.
    Non cela n'a rien à voir. Si tu veux stocker des choses il vaut mieux utiliser un conteneur adapté. Et dans le conteneur usuellement on stacoke des poiteur, car pour des opérations de trie c'est plus léger à manipuler qu'une classe entière avec toutes ces données.

    De même pour l'agrégation!
    Non pour l'agrégation utiliser de l'allocation dynamique n'est pas forcément une bonne solution. Notamment pour ton exemple il vaut mieux le faire en statique. En fait tout dépend de ce que tu vas stocker. Selon moi les bonnes questions à se poser sont.
    Est-ce que je sais exactement ce que je vais stocker ? CaD est-ce que je connais le type exact et le nombre exact de ce que j'ai à stocker.

    Pour prendre un autre exemple, si tu veux un logiciel de dessin 2D et 3D alors une ligne est composé soit de points 2D (2 coodonnées comme dans ton exemple) soit de points 3D (3 coordonnées). Dans ce cas la, dans ta classe ligne, il vaut mieux stocker 2 pointeurs sur une classe point. De cette classe point tu fait dériver deux classes point2D et point3D.

    Autre exemple mettont que tu veuille ajouté une classe poligone. Un poligonne étant formé d'un nombre de points non déterminé. Dans ce cas la il faut mettre un conteneur de points dans ta classe poligonne.

  8. #8
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 279
    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 279
    Points : 11 015
    Points
    11 015
    Par défaut
    Citation Envoyé par BigNic
    Si j'ai bien compris pour créer des objets dynamiquement, le mieux est d'utiliser des conteneurs.
    Non cela n'a rien à voir. Si tu veux stocker des choses il vaut mieux utiliser un conteneur adapté. Et dans le conteneur usuellement on stacoke des poiteur, car pour des opérations de trie c'est plus léger à manipuler qu'une classe entière avec toutes ces données.
    C'est plutôt les sémantiques et les durées de vie qui guident mes choix. Et ayant rarement des gros objets à sémantique de valeur, je n'ai que rarement à me poser cette question là.

    Pour prendre un autre exemple, si tu veux un logiciel de dessin 2D et 3D alors une ligne est composé soit de points 2D (2 coodonnées comme dans ton exemple) soit de points 3D (3 coordonnées). Dans ce cas la, dans ta classe ligne, il vaut mieux stocker 2 pointeurs sur une classe point. De cette classe point tu fait dériver deux classes point2D et point3D.
    J'avais déjà discuté de cela ici, et je reste persuadé que ce n'est pas un bon design. Les points 2D et 3D ne se mélangent jamais. S'il doit (et peut!!) y avoir des algorithmes qui les manipulent indifféremment, autant passer sur du polymorphisme paramétrique. De même la ligne est définie par son contexte qui est l'espace (plus son référentiel) dans lequel elle se trouve. Je verrais plutôt un ligne<N> qui contiendrait deux points<N> et éventuellement une référence vers un référentiel. Mais on s'égare.

    En général, j'ai pour pseudo-heuritisque simpliste
    - relation 0/1..* : conteneur dynamique redimensionnable (de pointeurs ou des valeurs suivant les sémantiques)
    - relation 0/1..N : conteneur statique ou dynamique suivant l'humeur (ptr ou val)
    - relation 0/1 : pointeur (intelligent ou non)
    - relation 1 : (dans l'ordre de préférence) --> référence (si c'est un lien définitif), valeur (si aggrégation et que les durées de vie et sémantiques concordent (=> pas de RAZ à faire)), (scoped) pointeur (suivant les aggrégations), et simple pointeur (pour les liens réattachables)

    Après, je brode et improvise.

  9. #9
    Membre averti Avatar de icer
    Inscrit en
    Janvier 2006
    Messages
    332
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 332
    Points : 363
    Points
    363
    Par défaut
    Merci à tous pour votre participation à ce topic. C'était trés enrichissant.
    Pour résumer:
    - nombre de membre de la classe fixe --> définition statique.
    - nombre de membre de la classe variable --> utilisation de pointeur ou de conteneur

  10. #10
    Membre habitué Avatar de BigNic
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    195
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2004
    Messages : 195
    Points : 154
    Points
    154
    Par défaut
    Luc Hermitte à dit
    C'est plutôt les sémantiques et les durées de vie qui guident mes choix. Et ayant rarement des gros objets à sémantique de valeur, je n'ai que rarement à me poser cette question là.
    Effectivement la durée de vie est une chose importante, et je l'ai oublié méa culpa.
    Par contre contrairement à toi moi je ne manipule quasiment que des gros objets à sémantiques de valeurs. En plus je passe mon temps à les triéer les filtrer,... D'où mon exemple.

    Luc Hermitte à dit
    J'avais déjà discuté de cela ici, et je reste persuadé que ce n'est pas un bon design. Les points 2D et 3D ne se mélangent jamais.
    C'était juste un exemple dans la continuité de celui initial !

  11. #11
    Membre éclairé Avatar de HanLee
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    738
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2004
    Messages : 738
    Points : 871
    Points
    871
    Par défaut
    C'est quoi l'agrégation ?

  12. #12
    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
    Citation Envoyé par HanLee
    C'est quoi l'agrégation ?
    as-tu pris le temps de chercher la définition sur Google ?
    avec les mots clés "agrégation" et "C++" le 1er lien renvoie sur un article de Développez sur l'agrégation et la composition

  13. #13
    Membre averti Avatar de icer
    Inscrit en
    Janvier 2006
    Messages
    332
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 332
    Points : 363
    Points
    363
    Par défaut
    Citation Envoyé par HanLee
    C'est quoi l'agrégation ?
    L'agrégation est une notion du concept objet. Tu doit maitriser ce concept pour développer de façons structuré.

  14. #14
    Membre éclairé Avatar de HanLee
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    738
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2004
    Messages : 738
    Points : 871
    Points
    871
    Par défaut
    Disons qu'en fait j'comprenais tout ce que vous racontiez, mais l'agrégation pour moi c'est juste pour être prof.

    Donc j'voulais juste associer le mot à son sens dans ce contexte. OK j'vais chercher.

Discussions similaires

  1. [wxWidgets] Allocation statique et dynamique
    Par three minute hero dans le forum wxWidgets
    Réponses: 7
    Dernier message: 25/06/2007, 23h19
  2. Site statique et dynamique
    Par tnounou82 dans le forum Dépannage et Assistance
    Réponses: 2
    Dernier message: 23/04/2007, 12h58
  3. [RegEx] Trouver les appels statique et dynamique d'une class
    Par jeff_! dans le forum Langage
    Réponses: 8
    Dernier message: 07/04/2006, 16h31
  4. char *, string et tableau statique ou dynamique
    Par salseropom dans le forum C
    Réponses: 2
    Dernier message: 05/12/2005, 11h33
  5. Réponses: 2
    Dernier message: 19/08/2005, 16h02

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