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 :

C++ - les collections


Sujet :

C++

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    95
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 95
    Par défaut C++ - les collections
    Que faut il utiliser pour les collections en C++?

    std::tr1::unordered_map<>
    std::vector
    std::list
    ??
    Je fais un logiciel de gestion pour un bibliothèque.
    On m'a dit que la class vector n'était pas bien pour gérer une collection d'objet:

    En l'occurence, pour un logiciel de gestion type bibliothèque,le type vector n'a pas d'intérêt, vu que tu vas faire des insertions/suppression, et que tu vas sans doute accéder aux objects par autre chose qu'un simple numéro (à par l'ISDN, mais tu ne vas pas le stocker sur des entiers consécutifs).
    Que me conseiller vous d'utiliser?

  2. #2
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 287
    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 287
    Par défaut
    Si tu n'as pas beaucoup d'éléments, cela ne devrait pas faire une grande différence d'autant que tu risques de vouloir trier suivant plusieurs critères à un moment ou un autre.
    Tes objets seront très probablement manipulés par pointeur (sémantique de référence), donc faire des insertions reviendrait juste à déplacer des (/smart-)pointeurs.

    Les tables de hashages pourquoi pas pour les systèmes de dimension intermédiaires. Je regarderai quand même du côté de boost.multi_index pour les multi-indexage.

    Si tu as beaucoup d'éléments, utiliser une vraie base de données serait plus conseillé.
    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...

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    95
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 95
    Par défaut
    Citation Envoyé par Luc Hermitte
    Si tu n'as pas beaucoup d'éléments, cela ne devrait pas faire une grande différence d'autant que tu risques de vouloir trier suivant plusieurs critères à un moment ou un autre.
    Tes objets seront très probablement manipulés par pointeur (sémantique de référence), donc faire des insertions reviendrait juste à déplacer des (/smart-)pointeurs.

    Les tables de hashages pourquoi pas pour les systèmes de dimension intermédiaires. Je regarderai quand même du côté de boost.multi_index pour les multi-indexage.

    Si tu as beaucoup d'éléments, utiliser une vraie base de données serait plus conseillé.
    Je n'ai pas bien compris ce que tu m'a dit. Je débute en C++.
    En gros tu me conseil d'utiliser une liste chainé?
    pour ce qui est de la bdd je ne peux pas. Pas le droit (c'est dans le cadre d'un projet d'étude). J'utilise des fichiers.

  4. #4
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 287
    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 287
    Par défaut
    Non, pas une liste chainée. Une table de hashage, std::tr1::unordered_map<> en est une dans le principe je crois bien.

    Il est d'ailleurs surprenant qu'on t'en parle si tu débutes juste.
    Sinon, je conseille le vecteur de pointeurs dans un premier temps. Et si vraiment il y a trop d'éléments, migrer vers autre chose -> std::tr1::unordered_map<> ou std::map si avoir un index a un sens.
    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...

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    95
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 95
    Par défaut
    mh mh ca à l'air compliqué tout ca (le nom déroute). Avec java j'utilisais les vecteur c'était cool. Mais apparement en C++ c'est différent.

  6. #6
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Bof, pas tellement différent, une collection reste une collection quel que soit le langage. Et coup de bol, j'ai bien l'impression que ce que Java appelle Vector correspond à ce que C++ appelle std::vector. La seule différence est qu'en Java, un Vector doit être semblable en performances à un vector de pointeurs en C++.

    Et dans les deux cas, ce n'est pas le conteneur approprié pour insérer/supprimer des éléments au milieu (complexité O(n)), ou effectuer des recherches indexées, même si pour des conteneurs de patite taille la différence ne se voit probablement pas.

    <mode troll>
    Peut être que la principale différence est qu'en C++ les gens font attention à la complexité des algorithmes qu'ils utilisent
    </mode>
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    95
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 95
    Par défaut
    Bon donc je vais utiliser les vecteur alors...

  8. #8
    Membre éprouvé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 109
    Par défaut
    C'est pratiquement comme en Java.. Sauf que en C++, on a plus de possibilités.
    On peut les parcourir par itérateurs (comme Java).


    vector -> Excellent pour les sélections, mauvais pour les insertions. Possibilité d'accès direct. Le plus utilisé, le plus proche des tableaux classiques, sauf qu'il peut changer de taille.

    list-> Excellent en insertion, pas d'accès direct sauf le premier membre.
    Possibilité de tri.

    deque-> un mix des deux, avec accès direct autorisé, moyen en insertion, moyen en sélection. Rarement utilisé.

    map-> c'est exactement comme un répertoire.
    par exemple, map<int,string> te permet de trouver le string correspondant à un int donné.


    Donc :
    - Si tu as peu d'insertions et beaucoup de sélection, le vector est indiqué
    - Si tu n'as pas d'accès direct , la list.
    - et map pour des trucs genre répertoires.

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    95
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 95
    Par défaut
    Dans mon cas je vais faire
    des insertions
    des tris (après insertion ou avant)
    accès direct? je ne pense pas. Je pense faire des recherches séquencielles pour ce qui est des accès.

    EDIT: heu pour les accès direct j'imagine que tu parle de la méthode operator []... Danc ce cas ouais j'ai besoin d'avoir des accès direct.

    Si c'est comme en java y pas de souci pour l'insertion dans les vecteurs...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    monVecteur.InsertElementAt( i, monObjet );
    je crois que c'était comme ca en java.

  10. #10
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    On peut effectivement insérer, et ça marche, comme en Java. Ce n'est par contre pas très efficace sur ce type de collection, comme en Java.

    Il n'y a aucune collection qui soit hyper efficace pour toutes les opérations que tu comptes faire. Alors, plusieurs possibilités :
    - Une opération est moins courante qu'une autre : dis nous laquelle, on pourra te conseiller la bonne collection
    - Tu te moques des performances, de toute façon, la liste restera de petite taille : continue à utiliser vector
    - Parfois des solutions où on gère en parallèle les données dans plusieurs collections différentes sont intéressantes.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    95
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 95
    Par défaut
    Citation Envoyé par JolyLoic
    On peut effectivement insérer, et ça marche, comme en Java. Ce n'est par contre pas très efficace sur ce type de collection, comme en Java.

    Il n'y a aucune collection qui soit hyper efficace pour toutes les opérations que tu comptes faire. Alors, plusieurs possibilités :
    - Une opération est moins courante qu'une autre : dis nous laquelle, on pourra te conseiller la bonne collection
    - Tu te moques des performances, de toute façon, la liste restera de petite taille : continue à utiliser vector
    - Parfois des solutions où on gère en parallèle les données dans plusieurs collections différentes sont intéressantes.
    Voilà. Je me fou des performance : c'est un prog. pour un projet scolaire... donc peu de données. on ne recherche pas la performance.
    Je vais utiliser en effet plusieurs collections.
    Mon prog. permet de gérer une bibliothèque :
    • *Collection Adhérent
      *Collection Ouvrage
      *Collection Emprunt (ouvrage/Adhérent)
      *Réservation
      *...

    Donc je pense que je vais utiliser les vector.

  12. #12
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    95
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 95
    Par défaut
    Hello, finalement je suis obligé, c'est imposé... je dois utilisez les listes chaînées pour faire mes collections!
    Je me suis donc mis dans la tête de faire une class template Liste qui créé une liste chainé d'un type donné.
    Mais je n'y arrive pas. J'ai beucoup de souci de compilation au niveau de mes malloc. Pouvez vous m'aider??

    Voici ma classe :
    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
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
     
    #ifndef LISTE_H
    #define LISTE_H
     
    #include <string.h>
    #include <stdlib.h>
    #include <stdio.h>
    #include <iostream.h>
     
    template <class T>
    class Liste
    {
    	typedef struct listeC
        {
    		T _element ;
    		struct liste *precedent ;
    		struct liste *suivant ;
        }liste;	
     
    	liste *debut ;	
    	int nbElement ;
     
    public:
    	Liste() ;
    	Liste( const T &element ) ;
     
    	int ajouteElement( const T &element ) ;
     
    	int getNbElement() ;
     
    };
     
    template <class T>
    Liste<T>::Liste()
    {
    	debut = NULL ;
    	nbElement = 0 ;
    }
     
    template <class T>
    Liste<T>::Liste( const T &element )
    {
    	debut = new T; 
     
    	_element = element ;
    	debut.precedent = NULL ;
    	debut.suivant = NULL ;
     
    	nbElement = 1;
    }
     
    template <class T>
    int Liste<T>::ajouteElement( const T &element )
    {
    	liste *courant ;
     
    	if( debut == NULL )
    	{
    		debut = new T; 
    		_element = element ;
    		nbElement = 1;
    	}
    	else
    	{
    		while( courant->suivant != debut )
    		{
    			courant = courant->suivant ;
    		}
    		if( courant->suivant == debut )
    		{
    			courant->suivant = new T; 
    			courant->suivant->_element = element;
    			courant->suivant->suivant = debut;
    			debut->precedent = courant->suivant;
    		}
    	}
    	return 1;
    }
     
    template <class T>
    int Liste<T>::getNbElement()
    {
    	return nbElement;
    }
     
    #endif
    Dans ma classe pour l'instant j'ai donc fait :
    • un conctructeur
      un conctructeur de recopie
      une méthode permettant d'ajouter une élément dans ma liste chaîné
      un accesseur qui retourne le nombre d'élément de ma liste chaîné


    J'ai en attribut de classe une structure : ma liste chainé
    l'adresse du début de ma liste chainé
    et un entier qui correspond au nombre d'élément de ma liste chainé.
    Ma liste chainé est une liste doublement chainé avec un lien vers le chainon suivant et un lien vers le chainon précédent.
    C'est donc une liste chainé circulaire.

  13. #13
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    95
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 95
    Par défaut
    Cette ligne de code pose problème par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    debut = new Liste<T>;
    Erreur :
    error C2440: '=' : cannot convert from 'class Liste<class Emprunteur> *' to 'struct Liste<class Emprunteur>::listeC *'

    En fait dans ce cas là je fait une liste chainé contenant des objets Emprunteur

  14. #14
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    95
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 95
    Par défaut
    Voilà j'ai passé mon aprem dessu...
    Tout fonctionne sauf un petit détail...
    Voici le code :
    #ifndef LISTE_H
    #define LISTE_H

    #include <stdio.h>
    #include <stdlib.h>
    #include <iostream.h>
    #include <string.h>

    template <class T>
    class Cellule
    {
    public:
    T _valeur ;
    Cellule *_suivant ;

    Cellule() ;
    Cellule( const T &valeur ) ;
    ~Cellule() ;

    //Accesseur
    T getValeur() ;
    Cellule<T> *getSuivant() ;

    //Modificateur
    void setSuivant( Cellule<T> * cellSuivante ) ;
    void supprSuivant() ;
    };

    template <class T>
    Cellule<T>::Cellule()
    {
    _suivant = NULL ;
    }

    template <class T>
    Cellule<T>::Cellule( const T &valeur )
    {
    _valeur = valeur ;
    _suivant = NULL ;
    }

    template <class T>
    Cellule<T>::~Cellule()
    {
    if( _suivant != NULL )
    {
    _suivant->~Cellule() ;
    }
    free( _suivant ) ;
    }

    template <class T>
    T Cellule<T>::getValeur()
    {
    return( _valeur ) ;
    }

    template <class T>
    Cellule<T> *Cellule<T>::getSuivant()
    {
    return( _suivant );
    }

    template <class T>
    void Cellule<T>::setSuivant( Cellule<T> * cellSuivante )
    {
    if( cellSuivante == NULL )
    {
    _suivant=NULL ;
    }
    else
    {
    _suivant = new Cellule ;
    *_suivant = *cellSuivante ;
    }
    }

    template <class T>
    void Cellule<T>::supprSuivant()
    {
    _suivant->~Cellule() ;
    free( _suivant ) ;
    }

    //------------------------------------------

    template <class T>
    class Liste
    {
    public:
    Cellule<T> **_debut ;
    int _nbElement ;

    Liste() ;
    Liste( const T &element ) ;
    Liste( const Liste &uneListe ) ;

    ~Liste() ;

    //Accesseurs
    int getNbElements () ;
    T * operator []( int position );
    void insertionPosition( int position, const T &element ) ;

    //Modificateur
    void insererElementA( int position, const T &element ) ;
    int *rechercherElement( const T &element ) ;

    //Lecture / ecriture dans les fichiers
    int ecriture( char *chemin_fichier );
    int lecture( char *chemin_fichier );


    private :
    T * getElement( int position );
    };

    template <class T>
    Liste<T>::Liste()
    {
    _debut=NULL ;
    }

    template <class T>
    Liste<T>::Liste( const T &element )
    {
    _debut = new Cellule<T>(element) ;
    }

    template <class T>
    Liste<T>::Liste( const Liste &uneListe )
    {
    Cellule<T> *courant ;
    int i ;

    if ( uneListe._debut != NULL )
    {
    _debut = new Cellule<T>( uneListe._debut->getValeur() ) ;
    _debut.setSuivant( uneListe_debut->getSuivant() ) ;

    courant = uneListe._debut->getSuivant() ;
    i = 1 ;

    while ( courant != NULL )
    {
    this->insererElementA ( ++ i, courant._debut->getValeur() )
    courant = courant->getSuivant() ;
    }
    }
    else
    {
    _debut = NULL ;
    }
    }

    template <class T>
    Liste<T>::~Liste()
    {
    if( _debut!=NULL )
    {
    _debut->~Cellule() ;
    }
    free( _debut ) ;
    }

    template <class T>
    T * Liste<T>::operator []( int position )
    {
    int i ;
    Cellule<T> *courant ;
    T *element ;

    i = 1 ;
    courant = *_debut ;
    element = NULL ;

    if( position > 0 )
    {
    while( courant != NULL && i<position )
    {
    courant = courant->getSuivant() ;
    i ++ ;
    }
    if(courant!=NULL)
    {
    element = new T ;
    *element = courant->getValeur() ;
    }
    else
    {
    printf( "erreur" ) ;
    }
    }
    else
    {
    *element = *_debut->getValeur() ;
    }
    return( element ) ;
    }

    template <class T>
    T *Liste<T>::getElement( int position )
    {
    int i ;
    Cellule<T> *courant ;
    T *element ;

    i = 1 ;
    courant = _debut ;
    element = NULL ;

    if( position > 0 )
    {
    while( courant != NULL && i<position)
    {
    courant = courant->getSuivant() ;
    i++ ;
    }
    if(courant!=NULL)
    {
    element = new T ;
    *element = courant->getValeur() ;
    }
    else
    {
    printf("erreur") ;
    }
    }
    else
    {
    *element = _debut->getValeur() ;
    }
    return( element ) ;
    }

    template <class T>
    void Liste<T>::insererElementA( int position, const T &element )
    {
    int i ;
    Cellule<T> nouvelElement( element ), *courant ;
    if( position==0 )
    {
    if( getNbElements()!=0 )
    {
    nouvelElement.setSuivant( *_debut ) ;
    }
    else
    {
    nouvelElement.setSuivant( NULL ) ;
    }
    *_debut = new Cellule<T> ;
    *_debut = &nouvelElement ;
    }
    else if( position > 0 )
    {
    if( position >= ( getNbElements() ) ) //Insertion à la fin
    {
    courant = *_debut ;
    while( courant->getSuivant() != NULL )
    {
    courant = courant->getSuivant() ;
    }
    if( courant->getSuivant() == NULL )
    {
    courant->setSuivant( &nouvelElement ) ;
    }
    else
    {
    printf( "erreur : Insertion à la fin \n" ) ;
    }
    }
    else //insertion dans la liste
    {
    courant = *_debut ;
    i = 0 ;
    while( courant->getSuivant() != NULL && i != position )
    {
    courant = courant->getSuivant() ;
    }
    if( courant->getSuivant() != NULL && i == position )
    {
    nouvelElement.setSuivant( courant->getSuivant() );
    courant->setSuivant( &nouvelElement ) ;
    }
    else
    {
    printf( "erreur : insertion dans la liste\n" ) ;
    }
    }
    }
    }

    template <class T>
    int Liste<T>:: getNbElements ()
    {
    Cellule<T> *courant ;
    courant = *_debut ;
    int i =0 ;

    while ( courant != NULL )
    {
    courant = courant->getSuivant() ;
    i ++ ;
    }
    return i ;
    }

    template <class T>
    int *Liste<T>::rechercherElement( const T &element )
    {
    int *position, n, i ;

    position = NULL ;
    i = 1 ;

    n = getNbElements();

    while( position == NULL && i <= n )
    {
    if( *getElement( i ) == element )
    {
    position = new int ;
    *position = i ;
    }
    i ++ ;
    }

    return( position ) ;
    }

    template <class T>
    int Liste<T>::ecriture( char *chemin_fichier )
    {
    FILE *fichier ;
    int ecriture = 0 ;

    Cellule<T> *courant = *_debut ;
    fichier = fopen( chemin_fichier, "wb" ) ;
    if ( fichier == NULL )
    {
    printf( "Erreur sur ouverture en ecriture du fichier binaire : %s", chemin_fichier ) ;
    //exit(-1);
    }
    else
    {
    while(courant != NULL)
    {
    fwrite( courant, sizeof( Cellule<T> ), 1, fichier ) ;
    courant = courant->getSuivant() ;
    }
    ecriture = 1 ;
    }
    return ecriture ;
    }

    template <class T>
    int Liste<T>::lecture( char * chemin_fichier )
    {
    FILE *fichier ;
    int lecture = 0 ;

    int premierMaillon = 0 ;

    Cellule<T> *courant ;
    Cellule<T> *precedent, *nouveau = NULL ;
    //Cellule<T> **leDebut ;

    precedent = NULL ;//_debut;
    fichier = fopen(chemin_fichier, "rb") ;

    if (fichier == NULL)
    {
    printf("Erreur sur ouverture en lecture du fichier binaire : %s\n", chemin_fichier);
    //printf("La reinstallation du programme est necessaire!!!");
    //exit(-1);
    }
    else
    {
    nouveau = new Cellule<T> ;
    while( fread( nouveau, sizeof( Cellule<T>), 1, fichier ) )
    {
    if ( premierMaillon == 0 )
    {
    premierMaillon = 1 ;
    _debut = &nouveau ;
    }
    else
    {
    courant->setSuivant( nouveau ) ;
    }
    courant = nouveau ;
    nouveau->setSuivant( NULL ) ;
    nouveau = new Cellule<T> ;
    }
    lecture = 1;
    }
    fclose( fichier ) ;
    return lecture ;
    }

    #endif
    C'est donc deux classe template. Une qui décrit une liste chainé et une autre qui l'exploite.
    Avec gestion ecriture/lecture des données ds un fichier binaire.
    Voilà le souci est celui-ci :
    *element = *_debut->getValeur() ;
    _debut est un pointeur de pointeur sur un objet Cellule<T> (liste chainé).
    element est un pointeur sur un element de tye T (élément de la liste chainé).
    pas moyen de corriger l'erreur d'écriture :
    error C2227: left of '->getValeur' must point to class/struct/union

  15. #15
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    95
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 95
    Par défaut
    *element = (*_debut)->getValeur() ;
    tout simplement.

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

Discussions similaires

  1. problème avec les collections
    Par root76 dans le forum Langage
    Réponses: 4
    Dernier message: 08/01/2007, 15h06
  2. pb avec struts et les collections
    Par zola dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 06/04/2006, 10h53
  3. [10] forall et les collection de record
    Par noinneh dans le forum Oracle
    Réponses: 3
    Dernier message: 13/02/2006, 13h49
  4. [VB.NET] Utiliser les collections de contrôles (Textbox)
    Par dinbougre dans le forum Windows Forms
    Réponses: 3
    Dernier message: 09/01/2005, 18h57

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