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 :

Problème de pointeur dans un vecteur


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Fondateur
    Inscrit en
    Octobre 2002
    Messages
    445
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Fondateur
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2002
    Messages : 445
    Par défaut Problème de pointeur dans un vecteur
    Bonjour,

    J'ai un petit problème avec un vecteur de pointeurs.

    Voici le code qui pose problème : (j'ai volontairement vidé les classes et mis tout ensemble pour bien isoler le problème)

    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
     
    #include <iostream>
    #include <vector>
     
    using namespace std;
     
    class Element{
    	public :
    		string att1;
    };
     
    class Constante : public Element
    {
    	public :
    		string att2;
    };
     
     
    int main()
    {	
    	vector<Element*>* v = new vector<Element*>;
    	Element* elt = new Element();	
    	v->insert(elt);
                 // Constante* cte = new Constante();
                 // v->insert(cte);
     
     
     
    	return 0;
    }
    Lorsque je compile, g++ me dit en gros qu'il ne s'attend pas à avoir ce type lors de l'insertion dans le vecteur.

    Pourtant mon vecteur est bien un vecteur de pointeurs sur la classe Element.

    Quelqu'un saurait d'où cela peut venir ?

    Ma deuxième question concerne ce que j'ai mis en commentaire dans le code. L'insertion d'un pointeur sur la classe Constante est elle possible dans le vecteur compte tenu du fait que Constante hérite de Element ?

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 124
    Par défaut
    peux tu copier-coller l'erreur qu'il affiche stp?

  3. #3
    Membre émérite

    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    717
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 717
    Par défaut
    La fonction insert() s'utilise avec plusieurs arguments pour insérer un ou plusieurs éléments à une certaine position dans le vecteur. Pour ajouter un élément à la fin, c'est push_back().

  4. #4
    Membre éclairé
    Homme Profil pro
    Fondateur
    Inscrit en
    Octobre 2002
    Messages
    445
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Fondateur
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2002
    Messages : 445
    Par défaut
    Citation Envoyé par Sylvain Togni Voir le message
    La fonction insert() s'utilise avec plusieurs arguments pour insérer un ou plusieurs éléments à une certaine position dans le vecteur. Pour ajouter un élément à la fin, c'est push_back().
    Effectivement ça marche, j'ai pas assez regardé la doc. Merci.

  5. #5
    Membre émérite

    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    717
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 717
    Par défaut
    L'insertion d'un pointeur sur la classe Constante est elle possible dans le vecteur compte tenu du fait que Constante hérite de Element ?
    Oui, c'est le principe même du polymorphisme de classe, un pointeur (ou référence) vers un objet dérivé peut être utilisé partout où un pointeur (ou référence) vers un objet de base est attendu.

  6. #6
    Membre éprouvé
    Inscrit en
    Mai 2007
    Messages
    157
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Mai 2007
    Messages : 157
    Par défaut
    en effet insert s'utilise avec insert(position, iteration, valeur)
    dans ton cas il faudrait faire par exemple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    v->insert(v->end(),1,elt);

  7. #7
    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
    Par défaut
    Les variables intermédiaires elt et cte ne servent à rien.
    Ensuite, ce genre de chose reste une erreur de conception. Qui se charge de gérer la durée de vie des objets dynamiquement alloués ?

  8. #8
    Membre éclairé
    Homme Profil pro
    Fondateur
    Inscrit en
    Octobre 2002
    Messages
    445
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Fondateur
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2002
    Messages : 445
    Par défaut
    Citation Envoyé par loufoque Voir le message
    Les variables intermédiaires elt et cte ne servent à rien.
    Ensuite, ce genre de chose reste une erreur de conception. Qui se charge de gérer la durée de vie des objets dynamiquement alloués ?

    Effectivement les variables intermédiaires ne servent à rien mais pour montrer un problème j'ai sorti l'erreur de mon code et j'ai fait en sorte de rendre ce bout de code le plus explicite possible.

    Le problème avec mon vecteur c'est que je le crée à l'intérieur d'une méthode et ensuite je le renvoie.

    Au départ, je ne comptais faire qu'un pointeur sur un vecteur pour pouvoir le renvoyer et ensuite y accéder mais je me suis demander si les objets que je mettrais dans ce vecteur seraient accessibles à l'extérieur si je ne mettais pas des pointeurs.

  9. #9
    Membre éclairé Avatar de befalimpertinent
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    561
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Avril 2007
    Messages : 561
    Par défaut
    Citation Envoyé par sylsau Voir le message
    Au départ, je ne comptais faire qu'un pointeur sur un vecteur pour pouvoir le renvoyer et ensuite y accéder mais je me suis demander si les objets que je mettrais dans ce vecteur seraient accessibles à l'extérieur si je ne mettais pas des pointeurs.
    Non pour pouvoir utiliser le polymorphisme tu dois obligatoirement passer par des pointeurs ou des références.

    En revanche ce que souligne loufoque est que tu dois t'occuper de gérer correctement la mémoire (smart pointeur de Boost, compteur de référence) sous peine d'avoir des surprises si un des pointeurs de ton vecteur est supprimer en dehors de tout contrôle. Dans ce cas ta méthode pour vider ton vecteur (cf FAQ http://c.developpez.com/faq/cpp/inde...elete_sequence
    risque d'avoir quelques soucis )
    Si tu ne veux pas t'embêter avec tout ça tu dois au moins être sur qu'aucun delete ne sera fait sur un des éléments du vecteur avant que tu le vides avec la méthode approprié. Et que une fois vider tu sois sur de ne plus accéder à ces éléments.

  10. #10
    Membre éclairé Avatar de befalimpertinent
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    561
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Avril 2007
    Messages : 561
    Par défaut
    Pourquoi un pointeur sur le vecteur ? Ne peux tu pas faire simplement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    int main()
    {	
    	vector<Element*> v;
    	Element* elt = new Element();	
    	v.push_back(elt);
            Constante* cte = new Constante();
            v.push_back(cte);
     
    	return 0;
    }
    Ma deuxième question concerne ce que j'ai mis en commentaire dans le code. L'insertion d'un pointeur sur la classe Constante est elle possible dans le vecteur compte tenu du fait que Constante hérite de Element ?
    Oui, par polymorphisme cf FAQ pour plus de renseignements

  11. #11
    Membre éclairé
    Homme Profil pro
    Fondateur
    Inscrit en
    Octobre 2002
    Messages
    445
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Fondateur
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2002
    Messages : 445
    Par défaut
    Citation Envoyé par befalimpertinent Voir le message
    Pourquoi un pointeur sur le vecteur ? Ne peux tu pas faire simplement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    int main()
    {	
    	vector<Element*> v;
    	Element* elt = new Element();	
    	v.push_back(elt);
            Constante* cte = new Constante();
            v.push_back(cte);
     
    	return 0;
    }


    Oui, par polymorphisme cf FAQ pour plus de renseignements

    L'exemple de code que j'ai mis est hors contexte.
    Dans mon code complet, je crée ce vecteur au sein d'une méthode et je le renvoie en sortie de la méthode.
    Pour pouvoir y accéder à l'extérieur il me fallait donc plutôt un pointeur.

    Peut-être qu'utiliser une référence est préférable dans ce cas là ? mais ne connaissant pas trop bien le C++, j'ai mis un pointeur comme j'aurais fait en C en fait.

Discussions similaires

  1. Problèmes de redondances dans un vecteur
    Par le.nono dans le forum Débuter avec Java
    Réponses: 3
    Dernier message: 25/02/2012, 09h21
  2. Trie de pointeurs dans un vecteur
    Par toams69 dans le forum C++
    Réponses: 5
    Dernier message: 23/09/2009, 10h05
  3. Réponses: 6
    Dernier message: 17/07/2008, 18h10
  4. Problème sur un pointeur dans une structure
    Par steph_1 dans le forum Langage
    Réponses: 5
    Dernier message: 05/09/2007, 18h59
  5. Problème d'heritage dans vecteur
    Par coco-loco dans le forum Langage
    Réponses: 3
    Dernier message: 07/02/2007, 11h28

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