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 :

Copie de vecteurs de pointeurs


Sujet :

C++

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2011
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2011
    Messages : 31
    Points : 22
    Points
    22
    Par défaut Copie de vecteurs de pointeurs
    Bonjour,

    Je suis confronté à un problème apparemmment commun en C++, à savoir j'ai "mal" copié un vecteur et je ne sais pas comment rectifier le tir.
    Je m'explique :

    Je dispose d'un object A de type vector<Objet*>. Dans une fonction je suis ammené à travailler cet objet A et à le transformer, MAIS, je tiens à conserver la version originale, c'est pourquoi je créé un objet B de type vector<Objet*>.
    J'instancie B (initialement identique à A) via :
    vector<Objet*> B = A;

    Par la suite je suis ammené à écrire quelque chose de la forme "A ---> B", et c'est là que je constate que j'ai copié les pointeurs vers les objets du vecteur A et non pas leur contenu et que par conséquent une modification de l'un modifie également l'autre.

    Ce que je voulais était obtenir un autre vecteur contenant des pointeurs vers une série d'objets DISTINCTS de ceux de A (même si identiques au début). J'ai mis un certain temps à déduire que les erreurs que j'obtenais vennaient de ma copie incorrecte.

    J'ai l'obligation de manipuler des pointeurs vers les objets (ceux-ci était bien trop gros pour être copiés), aussi quelle serait la bonne méthode pour procéder ?

    Je recours une fois de plus à votre aide, merci d'avance !

  2. #2
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 195
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 195
    Points : 17 163
    Points
    17 163
    Par défaut
    Qui doivent être distincts? les objets pointés, ou les listes de pointeurs?

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2011
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2011
    Messages : 31
    Points : 22
    Points
    22
    Par défaut
    J'aimerai obtenir 2 vector<Objet*> distincts, avec chacun une série de pointeurs pointant sur des Objets distincts, de sorte que je puisse manipuler l'un sans impacter l'autre.

    Cependant j'ai besoin initialement que les objets sur lequels ils pointent soient initalement identiques.

    Par exemple j'ai :
    vector<int*> A une liste de pointeurs vers des entiers (1, 2, 3, 4, 5).
    Je veux créer un vector<int*> B qui pointe lui aussi vers des entiers qui s'avèrent aussi valoir (1, 2, 3, 4, 5).
    Par la suite je modifie B pour que le vecteurs contienne des pointeurs vers quelque chose comme (1, 2, 3)... mais que A n'ait pas changé et pointe toujours vers (1, 2, 3, 4, 5).

    Initialement ils doivent être identiques, mais je veux pouvoir les manipuler séparément

    J'ai essayé une autre méthode :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    vector<Objet*> B;
    for(unsigned int i = 0; i < A.size(); i++){
    	B.push_back(A[i]);
    }
    Mais cela revient strictement au même...

    EDIT : Je pensais avoir découvers la solution avec la fonction vector::assign, mais je ne sais pas si c'est du a une mauvaise utilisation de ma part, mais cela ne modifie en rien mon erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    vector<Objet*> B;
    B.assign(A.begin(), A.end());

  4. #4
    Membre émérite Avatar de Astraya
    Homme Profil pro
    Consommateur de café
    Inscrit en
    Mai 2007
    Messages
    1 047
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Consommateur de café
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 047
    Points : 2 251
    Points
    2 251
    Par défaut
    Tu ne copie rien a part les pointeurs. Si tu veux faire ce que tu veux faire (lao tseu ) tu DOIS réallouer tout les éléments contenu dans ton vecteur A dans ton vecteur B avec un new et le constructeur par copie des Objets.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    vector<Objet*> B;
    for(unsigned int i = 0; i < A.size(); i++){
    	B.push_back(new Objet(A[i]));
    }
    EDIT: Et n'oublies pas de delete chaque élément des 2 vecteurs

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2011
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2011
    Messages : 31
    Points : 22
    Points
    22
    Par défaut
    EDIT : Merci, j'ai réussi a bidouiller un constructeur de copie pour mon objet, ça marche !

    Les pointeurs c'est de moins en moins mon truc, surtout depuis que je manipule réellement des objets

  6. #6
    Membre émérite Avatar de Astraya
    Homme Profil pro
    Consommateur de café
    Inscrit en
    Mai 2007
    Messages
    1 047
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Consommateur de café
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 047
    Points : 2 251
    Points
    2 251
    Par défaut
    http://cpp.developpez.com/faq/cpp/?p...tructeur_copie
    Tu devrais réviser les bases...
    dereference ton A[i]

  7. #7
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 629
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 629
    Points : 30 692
    Points
    30 692
    Par défaut
    Salut,

    La bonne question à se poser en tout premier lieu est surtout: Pourquoi avoir créé un vecteur de pointeur

    Car, de deux choses l'une:

    Soit ton vecteur contient des objets dont le type a sémantique de valeur, et tu aurais beaucoup plus facile de travailler avec un vecteur d'objets au lieu de travailler avec un vecteur de pointeur sur objet

    Soit ton vecteur contient des objets dont le type a sémantique d'entité, et tes objet ne devraient pas être copiables (meme si on peut envisager de les rendre clonable) et il est plus ou moins illogique de vouloir les copier, sauf cas particulier (de création d'une historique "undo / redo" par exemple), car chaque objet doit être identifiable de manière unique et non ambigue, et que tu voudras que tout ce qui arrive à un objet donné soit bien répercuté dessus.

    Toute la question à la base peut donc se résumer, en gros, à "Ton type Objet est il polymorphe ou non?" et la cohérence de ton envie de copier les élément dépendra fortement de ta réponse

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Arbre N-aire avec des vecteurs de pointeurs
    Par valderama dans le forum Débuter
    Réponses: 3
    Dernier message: 15/01/2009, 16h42
  2. Prob : Suppresion instance d'un vecteur de pointeurs
    Par Julien_C++ dans le forum C++
    Réponses: 5
    Dernier message: 01/04/2007, 20h50
  3. Copie de structure par pointeur - Problème LSB MSB
    Par the_ionic dans le forum Réseau
    Réponses: 4
    Dernier message: 17/07/2006, 15h08
  4. [Débutant]Vecteur de pointeurs
    Par @r$£~%[ dans le forum C++
    Réponses: 18
    Dernier message: 09/08/2005, 16h19
  5. Réponses: 3
    Dernier message: 24/04/2005, 14h19

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