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++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    49
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2008
    Messages : 49
    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 émérite
    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
    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 averti
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    49
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2008
    Messages : 49
    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 émérite
    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
    Par défaut
    Parce qu'un vector de pointers n'a pas un destructeur qui fonctionne.

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

    Informations forums :
    Inscription : Novembre 2008
    Messages : 49
    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
    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 ?

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