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 :

Classe imbriquée - Iterateur


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2011
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2011
    Messages : 16
    Par défaut Classe imbriquée - Iterateur
    Bonjour à toutes et à tous,

    Je suis entrain de coder une structure de données "Liste" comprenant des "Maillon". Afin de parcourir celle-ci plus facilement, je souhaite ajouter une classe imbriquée "Iterateur" cependant je rencontre quelques difficultés.

    Code allégée de la classe "Liste" :

    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
    48
    49
    50
    51
    52
    53
    54
    55
    template<class T> class Liste
    {
        friend class Maillon<T>;
     
        private:
            Maillon<T> *_tete, *_dernier;
     
        public:
            Liste();
            Liste(const Liste<T>& l);
            Liste<T>& operator=(const Liste<T>& l);
            ~Liste();
     
            Liste<T>& put_back(const Maillon<T>& m);
            Liste<T>& put_back(const T& val);
            Liste<T>& put_back(const Liste<T>& l);
     
            void flushMaillon();
            bool isEmpty() const;
            void toString() const;
     
            // Déclaration de la classe interne Iterateur
    	class Iterateur
    	{
    		private:
    			Maillon<T> *m;
     
    		public:
    			Iterateur():m(NULL {}
     
    			Iterateur(const Maillon<T>& value): m(value) {}
     
    			bool operator!=(const Iterateur& it)
    			{
    				return (m != it.m);
    			}
     
    			Iterateur& operator++()
    			{
    				m = m->suivant;
     
    				return *this;
    			}
    	};
     
    	Iterateur begin()
    	{
    		return Iterateur(_tete);
    	}
     
    	Iterateur end()
    	{
    		return Iterateur();
    	}
    };
    Code allégée de la classe "Maillon" :

    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
    template<class T> class Maillon
    {
        friend class Liste<T>;
     
        private:
            T _data;
            Maillon<T> *_suivant;
     
        public:
            Maillon();
            Maillon(const Maillon<T>& m);
            Maillon(const T& value);
            ~Maillon();
            Maillon<T>& operator=(const Maillon& m);
    };
    J'obtiens des erreurs via la ligne suivante (présente dans mon main) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Liste<int>::Iterateur it(l3.begin());
    Les erreurs sont les suivantes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    erreur: invalid user-defined conversion from ‘Maillon<int>*’ to ‘const Maillon<int>&’ [-fpermissive]
     
    erreur: invalid conversion from ‘Maillon<int>*’ to ‘const int&’ [-fpermissive]
     
    erreur:  initializing argument 1 of ‘Maillon<T>::Maillon(const T&) [with T = int][-fpermissive]
    Je suis un peu bloqué car je ne vois pas à quel niveau ça bloque, je "comprends" le problème mais suit dans l'incapacité de le résoudre. J'ai regardé des classes imbriquées similaires mais cela ne m'a aidé en rien ..

    Merci d'avance.

  2. #2
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    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 202
    Par défaut
    Bonjour,
    Le problème est dans le constructeur avec argument de l'itérateur:
    Iterateur(const Maillon<T>* value): m(value) {} fonctionnera mieux

    Iterateur(const Maillon<T>*& value): m(value) {} est envisageable

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    118
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 118
    Par défaut
    Iterateur(const Maillon<T>*& value): m(value) {}est envisageable
    L'intérêt est discutable dans ce cas précis sachant que le pointeur n'a aucunement besoin d'être modifié. A part une perte de performance, je n'en vois pas l'intérêt.

  4. #4
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    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 202
    Par défaut
    je l'ai seulement proposé parce que son code initial utilisait une référence…

  5. #5
    Membre chevronné

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    426
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 426
    Par défaut
    Salut Schnapse,
    Je ne sait pas si ça t'aidera, mais j'avais créé ce post dans le passé...

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

Discussions similaires

  1. [C#]Remonter des événements dans des classes imbriquées
    Par Kcirtap dans le forum Windows Forms
    Réponses: 9
    Dernier message: 14/12/2013, 12h43
  2. Classe imbriquée et son constructeur
    Par toninlg dans le forum C++
    Réponses: 7
    Dernier message: 30/09/2006, 06h21
  3. Classe imbriquée
    Par dj.motte dans le forum C++
    Réponses: 10
    Dernier message: 13/04/2006, 07h34
  4. classes imbriquées
    Par smedini dans le forum C++
    Réponses: 10
    Dernier message: 10/12/2005, 13h16
  5. Intérêt des classes imbriquées ?
    Par elitost dans le forum Langage
    Réponses: 5
    Dernier message: 21/10/2005, 09h30

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