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

SL & STL C++ Discussion :

vector de pointeurs sur des objet


Sujet :

SL & STL C++

  1. #21
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 296
    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 296
    Par défaut
    Tu écrivais là un mutateur (chose rarement utile je trouve ...). Obligatoirement il y a une recopie.
    En interne dans les fonctions de S, si v_ doit être initialisé depuis une autre fonction (externe à S cette fois) qui renvoie un vecteur, j'utiliserais directement swap() sur v_.

    Il est difficile de parler de manière générale. Suivant le problème, soit la copie n'est pas grave, soit on a directement ou indirectement (via un back_inserter p.ex.) accès à v_.

    Ce qui est certain, c'est que l'on va éviter d'avoir des std::vector<>*, au pire des cas on aurait des boost::shared_ptr<vector<> >. Mais quand on a des design avec un vecteur partagé entre plein d'objets, et qu'on ne peut pas vraiment décider d'un propriétaire, et que l'on a des fonctions qui renvoient des vecteurs entiers plutôt que de venir remplir directement le vecteur destinataire.
    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...

  2. #22
    Membre averti
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 24
    Par défaut
    j'ai parlé de pointeurs intelligents parce que j'ai pensé que tu voulais garder un lien vers tes objets créés, ou eviter des eventuels copies de ces objets ...

    si c'est ton vecteur entier que tu ne veux pas copier, quel est alors l'interet de faire un vecteur de pointeurs ?

    edit : désolé, avait pas vu la 2eme page ...

    si c'est seulement la copie de retour qui tennuie, std::auto_ptr est fait pour ca

  3. #23
    Membre du Club
    Inscrit en
    Août 2004
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 10
    Par défaut
    Finalement en lisant toutes ces réponses intéressantes, j'ai revu ma conception et suis arrivé à m'en sortir en faisant qq chose de beaucoup plus simple. Plus de pointeur sur des vecteurs de pointeurs (qui eux mêmes pointaient sur des objets contenant des pointeurs sur des listes de pointeurs...). En fait ces choix bizarres avaient pour origine une précédente conception où j'avais besoin de faire çà. Je voulais créer des objets qui contiennent des listes ou des vecteurs mais obliger la création et initialisation de la liste avant la création du conteneur. Je voulais absolument éviter des recopies car les objets contenus dans les listes peuvent être assez volumineux (images par exemple) et mon application a des contraintes de perfs (temps réel).
    Maintenant, je m'embête plus : les conteneurs ont un vecteur par valeur et proposent une simple méthode add. Je garde quand même le vecteur de pointeur parce que je ne veux pas faire de copie ni supprimer les objets contenus dans le vecteur.

    Merci pour vos réponses, ça m'a permis de prendre du recul sur mon code et de le revoir.
    Mais en fait il reste tout de même un petit problème : quand je demande à mes conteneurs d'initialiser leur vecteur avec une certaine capacité, il semble que je n'arrive plus à remplir le vecteur.
    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
     
    class Objet {
    public:
       void foo();
    }
     
    class Conteneur {
       std::vector<Objet*> m_Objets;
       Objet                     *m_ObjetCourant;
    public:
       int m_IndexObjet;    
     
       Conteneur() : m_IndexObjet(0){ 
          m_ObjetCourant = NULL;
       }
       Conteneur( int taille ): m_IndexObjet(0), m_Objets( taille )  {
           m_ObjetCourant = NULL;
       }
       void addObject(Objet *objet){
           m_Objets.push_back(objet);
           if (m_ObjetCourant == NULL) m_ObjetCourant = m_Objets[0];
       }
       void bar() {
           if (m_IndexObjet > 0 && m_IndexObjet < m_Objets.size()) {
               m_ObjetCourant = m_Objets[m_IndexObjet];
               m_ObjetCourant->foo();
           }
       }
    };
     
     
    Conteneur * creerConteneur() {
       Conteneur *conteneur = new Conteneur(3);
       Objet *o1 = new Objet();
       Objet *o2 = new Objet();
       return conteneur;
    }
     
     
    void main()
    {
       Conteneur *conteneur = creerConteneur();
       while(1) {
          conteneur->m_IndexObjet = (conteneur->m_IndexObjet + 1) %2;
           conteneur->bar();
       }
    }
    Quand je crée un Conteneur sans initialiser la taille de son vecteur, tout se passe bien. Quand je donne la taille alors j'arrive bien à exécuter la méthode foo() du premier objet contenu mais dès que je veux passer au suivant je récupère un pointeur NULL.
    Voyez vous une erreur dans ma façon de faire?

  4. #24
    Membre averti
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 24
    Par défaut
    Conteneur() : m_IndexObjet(0){
    m_ObjetCourant = NULL;
    }

    => tu peux ecrire

    Conteneur() : m_IndexObjet(0), m_ObjetCourant(NULL){
    }

    push_back ajoute un élément a la fin de ton vecteur ...

    si tu as réservé trois éléments, ils existent mais ne sont pas initialisés.
    un push_back en rajouter un 4eme (et les 3 premiers ns sont toujours pas initialisés)

  5. #25
    Membre du Club
    Inscrit en
    Août 2004
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 10
    Par défaut
    Merci!

  6. #26
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 296
    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 296
    Par défaut
    Il faut utiliser reserve() et pas resize() (que tu as utilisé indirectement avec le constructeur auquel tu as passé une taille)


    Sinon, il n'y aucun intérêt à avoir des pointeurs dans ton main.
    Quelques lectures pour te faire méditer pourquoi en C++ on fuit les pointeurs bruts :
    - http://www.gamedev.net/reference/art...article953.asp
    - http://www.relisoft.com/book/tech/index.htm
    - http://www.gotw.ca/gotw/ (items qui traitent des exceptions -> ^F)
    - Pour les autres ressources (autres que pointeurs), il y a ça : http://www.cuj.com/documents/s=8000/...r/alexandr.htm

    EDIT: des références en plus.
    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...

  7. #27
    Membre du Club
    Inscrit en
    Août 2004
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 10
    Par défaut
    Nickel, y'a tout qui marche!!
    Initialisation d'un vecteur, reserve puis après un série de push_back et ça roule.
    Merci à tous!

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. vector d'objets ou vector de pointeurs sur objets
    Par manitor dans le forum Débuter
    Réponses: 7
    Dernier message: 16/02/2012, 21h41
  2. probleme avec les pointeurs sur des objet heterogene
    Par Fifou625 dans le forum Débuter
    Réponses: 4
    Dernier message: 09/12/2011, 21h27
  3. suppression d'un pointeur sur un objet dans un vector
    Par Mindiell dans le forum SL & STL
    Réponses: 9
    Dernier message: 07/08/2008, 14h42
  4. utilisations de pointeurs sur des objets
    Par niarkyzator dans le forum Delphi
    Réponses: 21
    Dernier message: 13/12/2006, 09h42
  5. [Ada] Récupérer un pointeur sur un objet existant
    Par vincnet500 dans le forum Ada
    Réponses: 1
    Dernier message: 14/11/2004, 14h26

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