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 :

problème avec un vector d'objets contenant des iterators


Sujet :

SL & STL 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 problème avec un vector d'objets contenant des iterators
    Bonjour,

    J'ai passé un moment à parcourir le forum mais n'ai pas trouvé la réponse. Ma question reprend un peu les derniers échanges de mon dernier post, mais comme cela n'a rien à voir avec le titre, je me permets d'ouvrir une nouvelle discussion.

    J'ai une classe:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    Class A{
    list<int> m_List;
    list<int>::iterator m_element;
     
    public:
    A(list<int>&)
    };
     
    A::A(list<int>& list){
    m_List = list;
    m_element=m_List.begin(); 
    }
    J'ai besoin de m_element parce que je crée ensuite un vector de A, et j'ai besoin de savoir pour chaque liste quel est l'élément courant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    Class B{
    vector<A> m_Vect;
     
    public:
    B(list<int>&)
    };
     
    B::B(list<int>& list){
    A a(list);
    vector<A> vecttemp;
    vecttemp.push_back(a);
    m_Vect=vecttemp;
    }
    Avec ce code, m_element de a pointe sur le premier élément de m_List. Quand je fais (dans le constructeur de B) vecttemp.push_back(a), m_element "ne bouge pas", alors que bien entendu, ce qui m'intéresserait, c'est qu'il indique maintenant m_Vect[0].m_List.begin(). Existe-t-il une solution sans devoir le lui écrire explicitement dans le constructeur de B?

    Merci beaucoup

  2. #2
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Par défaut
    Bonjour Manitor

    m_element => list<int>::iterator (dans un objet A)

    _Vect[0].begin() => vector<A>::iterator (dans un objet B)

    Je ne comprend pas très bien ce que tu souhaites faire.

  3. #3
    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
    Salut,
    Je rajouterais que le constructeur ne peut pas avoir un retour
    :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    B::B(list<int>& list){
    A a(list);
    vector<A> vecttemp;
    vecttemp.push_back(a);
    return vecttemp; --> Ne compile pas !
    }
    Je suis comme gbdivers, je n'arrive pas à comprendre ce que tu veux faire. Qui doit se souvenir de quoi ?

  4. #4
    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
    Merci pour les réponses...

    Oui, bien sûr, pas de return dans un constructeur... Un moment d'égarement, j'ai corrigé mon code.

    Je vais essayer d'expliquer un peu mieux. J'ai donc une classe B qui est un vector<A>, où A est une liste d'entier (m_List) avec un iterator (m_element) pointant sur un élément la liste.

    Si je construis un objet B, noté b, à partir d'une liste d'entier (c'est le constructeur de B), je passe par le constructeur de A. Dans le constructeur de A, j'ai initialisé m_element comme étant le premier élément de m_List. Si je crée un A, noté a, quand je fais un push_back(a) pour en faire le premier élément de b, il fait une copie de la liste d'entier, ainsi qu'une copie de l'iterator pour l'insérer dans le vector. L'iterator pointe toujours vers a.begin(), alors que j'aimerais qu'il pointe vers le premier élément de la copie de m_List qui vient d'être ajoutée vector, soit b.m_Vect[0].m_List.begin() (deuxième faute de ma première demande que je corrige aussi...).

  5. #5
    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
    En préambule, je dirais que je n'aime pas trop me trimbaler des itérateurs dans des objets.
    Mais pour répondre à ton problème, tu devrais redéfinir le constructeur par copie de A (et l'opérateur = aussi) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
       A(const A&rhs_)
       :m_List(rhs_.m_List)
       {
          m_element = m_List.begin();
       }

  6. #6
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Par défaut
    Ok, c'est la suite de la discussion : http://www.developpez.net/forums/d80...ment-fonction/

    Pour info 3Darchi, c'est moi qui lui ai conseillé de mettre sa liste et son pointeur dans une classe.

    Mais le but était de garder un lien vers le dernier élément inséré (qui n'est pas forcement en première position). Dans ce cas, le mieux est d'invalider le pointeur et de ne plus l'utiliser (sinon, il faut rechercher dans la nouvelle liste l'ancien élément pointé, etc. Un peu lourd).

    Sinon, explique pourquoi tu veux garder un pointeur sur le dernier élément inséré. Il y a peut être moyen de faire autrement.

Discussions similaires

  1. Problème avec XSLT et du XML contenant des balises HTML
    Par xamber dans le forum XML/XSL et SOAP
    Réponses: 2
    Dernier message: 02/11/2011, 11h45
  2. Solide problème avec visualisation d'un objet 3D
    Par vdumont dans le forum OpenGL
    Réponses: 2
    Dernier message: 12/05/2006, 15h43
  3. Problème avec std::Vector
    Par mister3957 dans le forum SL & STL
    Réponses: 8
    Dernier message: 16/02/2006, 10h18
  4. [EJB2.1 Entity] [CMP] Problème avec l'extraction de la collection des fk.
    Par Last newbie dans le forum Java EE
    Réponses: 1
    Dernier message: 24/12/2005, 16h48
  5. [TTreeView] Problème avec les pointeurs d'objet
    Par BlackWood dans le forum Composants VCL
    Réponses: 2
    Dernier message: 02/07/2004, 14h31

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