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 :

vector d'objets ou vector de pointeurs sur objets


Sujet :

C++

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    49
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2008
    Messages : 49
    Points : 22
    Points
    22
    Par défaut vector d'objets ou vector de pointeurs sur objets
    Bonjour,

    En résolvant un bug m'est venue cette question: j'ai deux classes A et B. Dans les membres de B, il y a un container type vector d'objets A...
    Vaut-il mieux que B soit un vecteur d'objets A ou un vector de pointeurs sur des objets A?
    Je précise aussi que la classe A est éventuellement une classe assez "complexe" et possédant un membre type pointeur sur une troisième classe...

  2. #2
    Membre éclairé
    Avatar de Ekleog
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    448
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2012
    Messages : 448
    Points : 879
    Points
    879
    Par défaut
    Si le polymorphisme n'est pas utilisé, et que les objets de la classe A ne sont pas présents ailleurs que dans le vector en mémoire, alors le vector d'objets est à préférer.
    Sinon, un vector de smart pointers (shared_ptr, unique_ptr, [auto_ptr si tu es au c++98 sans boost]), ... est à envisager, selon les cas.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    49
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2008
    Messages : 49
    Points : 22
    Points
    22
    Par défaut
    ok, et en termes compréhensibles (si possible) pour le débutant que je suis, pourquoi cette préférence pour les vector d'objets (plutôt que vector sur pointeurs)?

  4. #4
    Membre éclairé
    Avatar de Ekleog
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    448
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2012
    Messages : 448
    Points : 879
    Points
    879
    Par défaut
    Parce qu'un vector de pointers n'a pas un destructeur qui fonctionne.

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    49
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2008
    Messages : 49
    Points : 22
    Points
    22
    Par défaut
    mais si on construit le destructeur de la classe B de telle sorte qu'il parcourt le vector et détruise les pointeurs sur A:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    B::~B(){
    for(std::vector<A*>::iterator it=m_VectorA.begin(); it!=m_VectorA.end();it++) 
    delete (*it);
    }
    (m_VectorA est le membre de B étant le vector de pointeurs sur A). Cela revient-il au même alors?

  6. #6
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Bonjour,

    La gestion des pointeurs est affaire délicate surtout si tu es débutant. Je te conseille vivement de ne plus utiliser de pointeurs nus dans ton code pour pouvoir te concentrer sur l'essentiel de ton projet. Et quand tu seras moins débutant, ... et ben tu sauras pourquoi tu ne veux pas utiliser de pointeur nus de toute façon

    Quelques lectures :
    Présentation des pointeurs intelligents en C++ par Loïc Joly
    Gérer ses ressources de manière robuste en C++ par Aurélien Regat-Barrel

    Donc ton code peut ressembler à
    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
    class C;
     
    class B
    {
     
       // ...
    private:
       std::unique_ptr<C> ptr_to_c;
    };
     
    class A
    {
       // ...
    private:
       std::vector<std::unique_ptr<B>> vec_ptr_b;
    };
    Sinon, quelques remarques
    Citation Envoyé par manitor Voir le message
    Je précise aussi que la classe A est éventuellement une classe assez "complexe" et possédant un membre type pointeur sur une troisième classe...
    Oups. Un problème de design ?

    Citation Envoyé par manitor Voir le message
    Vaut-il mieux que B soit un vecteur d'objets A ou un vector de pointeurs sur des objets A?
    Répondre à cette question dépend de différents critères. Je vois au moins ceux-ci :
    • B a-t-il vocation à être dérivé publiquement ?
    • Qui est responsable de la durée de vie de B
    • Comment sont crées les A et les B et comment sont-ils associés ?
    • Quel est le coût d'une copie de B ?

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    49
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2008
    Messages : 49
    Points : 22
    Points
    22
    Par défaut
    Merci pour ces remarques...
    Qu'il soit possible d'améliorer le design de mon projet, je n'en doute pas. Je peux être un peu plus précis quant à son contenu; c'est dans un cadre mathématique, il faut trianguler des surfaces (et les logiciels de triangulation existants ne s'appliquent pas à mon cas). Je les découpe d'abord en morceaux et je triangule chacun des morceaux. En parallèle, j'essaie de construire ce que l'on appelle en maths un complexe simplicial, c'est à dire qqch où est sauvé toute l'information sur la structure de la triangulation.

    Donc, la classe A pourrait être la triangulation, elle contient un container de morceaux de surface (par ex la classe B), qui contiennent eux-même un container des sommets de la triangulation (par ex la classe C) de chaque morceau.

    Mais dans triangulation, il y aussi une autre classe (disons D) qui est ce fameux complexe; il faut le voir comme qqch d'abstrait, contenant comme je le disais les informations sur la structure de la triangulation, mais pas d'information géométrique. Il s'agit essentiellement d'un container de ce que j'appelle des Vertex (des "points abstraits"). Chaque sommet géométrique (cette classe C) "pointerait" vers un Vertex du complexe. Il y a encore dans ce complexe deux autres containers, correspondant aux côtés et triangles de la triangulation. Les côtés (Classe Edge) contiennent des références vers deux Vertex, et les triangles (classe Triangle) des références vers trois Vertex. (les Edges contiennent aussi les références des triangles qui les contiennent, et réciproquement, les triangles contiennent des références vers les Edges qu'ils contiennent. Idem pour les Vertex qui contiendraient des pointeurs vers les Edges et les Triangle qui les contiennent).

    Bref, certainement une usine à gaz! En fait, ce qui serait un jour passionnant et très efficace, c'est de montrer ce programme à un vrai informaticien et voir toutes les subtilités de programmation, d'amélioration possibles... Un jour, peut-être!

  8. #8
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Citation Envoyé par manitor Voir le message
    Bref, certainement une usine à gaz! En fait, ce qui serait un jour passionnant et très efficace, c'est de montrer ce programme à un vrai informaticien et voir toutes les subtilités de programmation, d'amélioration possibles... Un jour, peut-être!
    La connaissance et l'utilisation des concepts de bases (au -, les 5 pilliers, OCP, SRP, ISP, LSP, DIP) devrait déjà grandement aider à trouver les principales failles de design et les retravailler.

    Un autre élément important concerne la durée de vie des différentes instances, l'identification de la responsabilité de création et ensuite le tissage des différents objets entre eux.


    Dans ce que tu décris, je vois dans la classe A un risque de 'sur'-responsabilité. Cette classe n'a-t-elle pas tendance à grossir et faire beaucoup de chose ? Ne risque-t-elle pas de devenir le point d'entrée obligé ? => attention à bien identifier sa responsabilité unique et ne pas l'étendre.

    Après, c'est difficile de répondre sans avoir une vue plus profonde du problème, mais la classe B me semble être une 'vue' sur l'ensemble des points de la classe 'C'. En ce sens, elle pourrait ne pas posséder forcément directement des tableaux de points mais des itérateurs vers ceux-ci.

    Autre chose me surprend, c'est le lien des points 'C' vers les vertex de 'D' mais peut être est-ce normal par rapport ton domaine. Ou alors ce lien est-il extérieur à la définition des points ?

Discussions similaires

  1. pointeurs sur objets en C #
    Par lemya dans le forum C#
    Réponses: 3
    Dernier message: 02/01/2008, 12h13
  2. Pointeur sur objet different
    Par peruvio dans le forum C++
    Réponses: 4
    Dernier message: 19/11/2007, 20h06
  3. Pointeur sur objet
    Par bubulemaster dans le forum Débuter
    Réponses: 5
    Dernier message: 26/09/2007, 09h10
  4. Tableau de pointeurs sur objets
    Par bassim dans le forum C++
    Réponses: 11
    Dernier message: 13/12/2005, 19h45
  5. [Debutant VC++.net] Obtenir un pointeur sur objet
    Par SteelBox dans le forum MFC
    Réponses: 6
    Dernier message: 17/06/2004, 18h36

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