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

Langage C++ Discussion :

problème avec liste doublement chainee definie en template!


Sujet :

Langage C++

  1. #1
    Membre averti
    Inscrit en
    Février 2006
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 16
    Par défaut problème avec liste doublement chainee definie en template!
    Bonjour à tous,
    j'ai un probleme avec les listes doublement chainées!!!
    la structure prevue est la suivante :
    1. j'ai un fichier liste.h qui definit un template:

    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
    #ifndef _LISTE_H
    #define _LISTE_H
    #include <iostream>
    using namespace std;
    // debut namespace
    namespace GestionListe {
    template <class T> class Liste;
     
    template <class T> class Element
    {
    friend class Liste<T>;
    private:
    T info; // la donnee à stocker de type T
    Element<T>* suivant;
    Element<T>* precedant; t
    public:
    Element<T>(T paramInfo): info(paramInfo), suivant(NULL), precedant(NULL){}
    };
     
    template <class T> class Liste
    {
    private:
    Element<T>* tete;
    Element<T>* queue;
    unsigned int nbElts;
    Liste(const Liste& l);
    void operator=(const Liste& l);
    public:
    Liste();
    ~Liste();
    Element<T>* ajouter(T paramInfo, Element<T>* EltPreced = NULL);
    void vider();
    void afficher() const;
    unsigned int getNbElts() const { return nbElts; };
    Element<T>* supprimer(Element<T>* Elt);
    Element<T>* rechercher(T paramInfo, Element<T>* Elt = NULL);
    bool existe(Element<T>* Elt);
    };
    } // fin namespace

    2. un fichier liste.cpp qui donne l'implementation:
    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
    //IMPLEMENTATION
    #include "liste.h"
    #include <iostream>
    using namespace GestionListe;
    using namespace std;
    // constructeur par defaut de liste
    template <class T> Liste<T>::Liste() {
    tete = NULL;
    queue = NULL;
    nbElts = 0;
    }
    //affiche toute la liste
    template <class T> void Liste<T>::afficher() const {
    if (tete == NULL) cout << "la liste est vide..." << endl;
    else {
    cout << "la liste contient : " << nbElts << " element(s)"<< endl;
    Element<T>* courant = tete;
    do {
    cout << "\t" << courant->info << endl;
    courant = courant->suivant;
    }
    while (courant);
    }
    }
     
    // Definition des autres membres .....
    3. dans mon main : mon pb est ici, je dois pouvoir constituer une liste de personnes, une liste d'etudiants, une liste de documents, ....
    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
     
    #include <iostream>
    #include "personne.h"
    #include "etudiant.h"
    #include "liste.h"
    using namespace GestionListe;
    using namespace std;
    // un exemple
    Etudiant Alain("Alain","IDIGO",1970,"Rue MAFUOSI",12343,"NB","It");
    cout << "\n creer une liste (vide)" << endl;
    Liste<Etudiant> listEtud;
    listEtud.afficher();
    cout << "ajouter un nouvel element cree par valeur" << endl;
    listEtud.ajouter(Alain);
    listEtud.afficher();
    Quand je compile ça me renvoie les erreurs :

    C:\Dev-Cpp\Projets\liste.cpp In member function `void GestionListe::Liste<T>::afficher() const [with T = Etudiant]':
    30 C:\Dev-Cpp\Projets\main.cpp instantiated from here
    44 C:\Dev-Cpp\Projets\liste.cpp no match for 'operator<<' in 'std::operator<< [with _Traits = std::char_traits<char>](((std::basic_ostream<char, std::char_traits<char> >&)(&std::cout)), ((const char*)"\t")) << courant->GestionListe::Element<Etudiant>::info'
    note C:\Dev-Cpp\include\c++\3.4.2\bits\ostream.tcc:
    63 candidates are: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(std::basic_ostream<_CharT, _Traits>&(*)(std::basic_ostream<_CharT, _Traits>&)) [with _CharT = char, _Traits = std::char_traits<char>]
    ...

    Voilà resumée la situation!!!
    J'attends vivement de votre aide car là je suis paumé, j'ai passé 3 jours dessus sans bouger!
    PS c'est la première fois j'utilise les templates! j'ai fouillé sur le net sans vraiment trop trouvé ce que je cherches!


    Merci à tous!!!

  2. #2
    Membre émérite Avatar de Herode
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2005
    Messages
    825
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2005
    Messages : 825
    Par défaut
    Ce n'est pas vraiment un problème de templates.
    La ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cout << "\t" << courant->info << endl;
    appelle l'opérateur << sur courant->info, qui est de type T = Etudiant.
    Je pense que tu n'as pas défini l'opérateur << pour la classe Etudiant.

  3. #3
    Membre averti
    Inscrit en
    Février 2006
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 16
    Par défaut
    merci de repondre aussi vite! je dois essayer cela (définir l'opérateur << pour la classe Etudiant) seulement je n'en ai vraiment pas dejà fait ça! peux-tu me guider?
    c'est pareil pour les autres opérateurs ainsi que les constructeurs par copie (ce sont mes bêtes noires, j'avoue)

  4. #4
    Membre émérite Avatar de Herode
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2005
    Messages
    825
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2005
    Messages : 825
    Par défaut
    Tout est dans les FAQ :

    Pour le principe : http://c.developpez.com/faq/cpp/?page=surcharge

    Pour ton cas particulier sur l'opérateur d'extraction : http://c.developpez.com/faq/cpp/?pag..._polymorphique

    Pour le constructeur par recopie et l'opérateur d'affectation, voir la FAQ également. Mais le compilateur en fournit une version par défaut, qui copie tout membre à membre. Voir si c'est pertinent ou pas en fonction de la classe concernée. Typiquement, une classe qui héberge des pointeurs ou toute autre ressource dynamique (surtout si elle les alloue/désalloue elle-même) doit surcharger ces deux méthodes.

  5. #5
    Membre averti
    Inscrit en
    Février 2006
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 16
    Par défaut
    génial, j'y suis dejà!!!
    j'essaie après ma lecture et je donne le resultat!
    merci beaucoup Herode!!!

  6. #6
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Si tu veux mon avis, tu devrais songer à réécrire ta classe Element<>. Elle n'a pas besoin d'avoir Liste comme ami si tu mets des accesseurs corrects - sinon, autant ne pas mettre les variables en private, ... -

  7. #7
    Membre averti
    Inscrit en
    Février 2006
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 16
    Par défaut
    Miles, je vais voir de près ce que tu proposes! A priori je ne vois pas bien, juste une idée! j vais y reflechir
    merci beaucoup

  8. #8
    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
    Et lis la FAQ sur les templates. Surtout au sujet de la séparation .h/.cpp.
    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...

  9. #9
    Membre averti
    Inscrit en
    Février 2006
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 16
    Par défaut
    la surcharge de l'operateur << fonctionne à present (merci pour ce coup de pouce) mais j'ai un autre problème maintenant:

    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
     // main.cpp
    #include <iostream>
    #include "personne.h"
    #include "etudiant.h"
    #include "liste.h"
    using namespace std;
    // un exemple
    cout << "\n creer une liste (vide)" << endl;
    Liste<int> listEnt;
    listEnt.afficher();
    cout << "ajouter un nouvel element cree par valeur" << endl;
    listEnt.ajouter(1);
    listEtud.afficher(); 
    cout << "ajouter un nouvel element cree par valeur" << endl;
    listEnt.ajouter(2);
    listEtud.afficher();
    Quand j'execute ça, ça marche très bien!
    mais quand je fais ça

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    // main.cpp
    #include <iostream>
    #include "personne.h"
    #include "etudiant.h"
    #include "liste.h"
    using namespace std;
    // un exemple
    Etudiant Alain("Alain","IDIGO",1970,"Rue MAFUOSI",12343,"NB","It");
    cout << "\n creer une liste (vide)" << endl;
    Liste<Etudiant> listEtud;
    listEtud.afficher();
    ça n'affiche pas bien : je ne vois que le 1970, 12343 le reste cè des arabesques
    et quand je fais pour deux etudiants :


    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
    // main.cpp
    #include <iostream>
    #include "personne.h"
    #include "etudiant.h"
    #include "liste.h"
    using namespace std;
    // un exemple
    Etudiant Alain("Alain","IDIGO",1970,"Rue MAFUOSI",12343,"NB","It");
    cout << "\n creer une liste (vide)" << endl;
    Liste<Etudiant> listEtud;
    listEtud.afficher();
    cout << "ajouter un nouvel element cree par valeur" << endl;
    Etudiant Paul("Paul","Dilbo",1940,"Rue Ouaga",1233,"B","BF");
    cout << "ça passe";
    listEtud.ajouter(Paul);
    là ça ne va pas du tout : ça affiche le resultat du code precedent et ça renvoie l'erreur d'application
    L'instruction à "0x7c920c27" emploie l'adresse mémoire "0x003cff9d". La mémoire ne peut pas être "read"...

    C'est comme si il n'arrivait pas à ajouter le deuxième element ou n'arrive pas à l'afficher (pourtant tout ça marche pr les int et types habituels). Solution?

    voici les parties de codes concernés:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    //personne.h
    friend ostream& operator << (ostream& O, const Personne& Pers) { 
        Pers.print(O); 
        return O; 
      }; //surcharge de l'operateur <<
      virtual void print(ostream& O) const{
        O << prenom << " " << nom << ", " << ne_en << " " << adresse << endl;
      }; // surcharge pr afficher les attributs de Personne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    //etudiant.h
    virtual void print(ostream& O) const{
         Personne::print(O);
         O << num_inscript << " " << statut << ", " << nationalite << endl;
      }; // affiche etudiant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     //liste.h
    template <class T> 
     void Liste<T>::afficher() const {    
    	if (tete == NULL) cout << "la liste est vide..." << endl;
    	else {
    	  cout << "la liste contient : " << nbElts << " element(s)"<< endl;
    	  Element<T>* courant = tete;
    	  do {
    	    cout << "\t" << courant->info << endl;
    		courant = courant->suivant;	
    	  }
    	  while (courant); 
    	}
     } //affiche toute la liste
    voilà où j'en suis!
    je vous remercie

    PS : Miles je n'ai pas reussi à implementer ta proposition! Il faut dire que c'est la première fois je fais un projet C++ complet

  10. #10
    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
    Pourquoi tu prends pas exemple sur std::list ?
    Je n'ai d'ailleurs pas compris l'intérêt de recréer ça.

  11. #11
    Membre averti
    Inscrit en
    Février 2006
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 16
    Par défaut
    merci loufoque!
    j'ai essayé et ça marche pour les types primitifs! mais quand je fais pour Etudiant par exemple, ça renvoie le warning :
    [Warning] cannot pass objects of non-POD type `class Etudiant' through `...'; call will abort at runtime
    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
    //main.cpp
    #include <list>	
    #include <iostream>	
    #include "personne.h"
    #include "etudiant.h"
     
    using namespace std;
     
    /* Fonction principale */
    int main(void)
    {
         cout << "Bienvenue \n" << endl;
         list<Etudiant> MaListeEtud;
    	 Etudiant Alain("Alain","Dissoir",1970,"Rue DonSan",12343,"NB","Fr");
         MaListeEtud.push_back(Alain);
         Etudiant Paul("Paul","Dilbo",1940,"Rue Ouaga",1233,"B","BF");
    	 MaListeEtud.push_back(Paul);
    	 Etudiant jenni ("Jennifer", "LOPEZ", 1983, "New Jersey", 4500, "Non boursier", "Americain" );
    	 MaListeEtud.push_back(jenni);
         for( list<Etudiant>::iterator iter=MaListeEtud.begin(); iter!=MaListeEtud.end();iter++ ){
             printf("%i\n", *iter); 
         }
        cout << "\n Aurevoir";
         cout << "\n"; 
         getchar();
         return 0; // Puis on quitte !!
    }

  12. #12
    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
    mais quand je fais pour Etudiant par exemple, ça renvoie le warning :
    [Warning] cannot pass objects of non-POD type `class Etudiant' through `...'; call will abort at runtime
    C'est à cause du printf("%i\n", *iter) qui n'a bien entendu aucun sens.
    Bon déjà, on utilise pas printf en C++, et puis printf ne supporte que les types de base (les POD, PlainOldDatatype ou truc du style), et toi tu lui fournis *iter qui est un Etudiant.

  13. #13
    Membre averti
    Inscrit en
    Février 2006
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 16
    Par défaut
    je ne connaissais pas les POD jusqu'à l'arrivée de ta reponse! merci.
    je sais que c'est cout pour C++, mais comme ça ne marchait pas j'ai pris ça me disant k printf C march C++!
    alors peux-tu juste me donner, vu le contenu de mon main, me donner une solution? pck là j plante en vrai! merci

  14. #14
    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
    Sans savoir ce qu'afficher un étudiant signifie, je ne peux pas t'aider.

  15. #15
    Membre averti
    Inscrit en
    Février 2006
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 16
    Par défaut
    plus haut j'ai fourni le contenu (coté affichage) de etudiant et personne
    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
    // personne.h
    #ifndef _PERSONNE_H
    #define _PERSONNE_H
    #include <iostream>
    using namespace std;
    class Personne
    {
     // *********************************** Attributs *****************************************
     
     protected: // Membres privés
      char* nom;
      char* prenom;
      int ne_en;
      char* adresse;
     
     public: // Membres publics
      char* getPrenom() const; // retourne le prenom de la personne
      void setPrenom(const char* newPrenom); // modifie le Prenom de la personne
      char* getNom() const; // retourne le Nom de la personne
      void setNom(const char* newNom); // modifie le Nom de la personne
      int getNe_en() const; // retourne l'age de la personne
      void setNe_en(int newNe_en); // modifie l'age de la personne
      char* getAdresse() const; // retourne l'adresse de la personne
      void setAdresse(const char* newAdresse); // modifier l'adresse de la personne
     
      friend ostream& operator << (ostream& O, const Personne& Pers) { 
        Pers.print(O); 
        return O; 
      }; //surcharge de l'operateur <<
      virtual void print(ostream& O) const{
        O << prenom << " " << nom << ", " << ne_en << " " << adresse << endl;
      }; // surcharge pr afficher les attributs de Personne
     
      Personne(); // constructeur par defaut
      Personne(const char* paramNom, const char* paramPrenom, int paramNe_en, const char* paramAdresse); // constructeur par affectation
      ~Personne(); // destructeur
     
    };
     
    #endif
    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
    // etudiant.h
    #ifndef _ETUDIANT_H
    #define _ETUDIANT_H
    #include <iostream>
    #include "personne.h"
    using namespace std;
    class Etudiant : public Personne
    {
     // *********************************** Attributs *****************************************
     
     private: // Membres privés
      int num_inscript; // numéro alloué à l'inscription
      char* statut; // statut de l'étudiant (boursier,non boursier,professionnel)
      char* nationalite; // nationalité de l'etudiant
     
     
     public: // Membres publics
      int getNum_inscript() const; // retourne le numero d'inscription de l'etudiant
      void setNum_inscript(int newNum); // modifie le numero d'inscription de l'etudiant
      char* getStatut() const; // retourne le statut de l'etudiant
      void setStatut(const char* newStat); // modifie le statut de l'etudiant
      char* getNationalite() const; // retourne la nationalité de l'etudiant
      void setNationalite(const char* newNat); // modifie la nationalité de l'etudiant
      virtual void print(ostream& O) const{
         Personne::print(O);
         O << num_inscript << " " << statut << ", " << nationalite << endl;
      }; // affiche etudiant
     
      Etudiant(); // constructeur par defaut
    //  Etudiant(const Etudiant& etud); // constructeur par copie
      Etudiant(const char* paramNom, const char* paramPrenom, int paramNe_en, const char* paramAdresse, int paramNum, const char* paramStatut, const char* paramNation); // constructeur par affectation
      ~Etudiant(); // destructeur
    };
     
    #endif
    Pour construire etudiant je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     Etudiant::Etudiant(const char* paramNom, const char* paramPrenom, int paramNe_en, const char* paramAdresse, int paramNum, const char* paramStatut, const char* paramNation):Personne(paramNom, paramPrenom, paramNe_en, paramAdresse) {
        num_inscript=paramNum;
        statut = new char[strlen(paramStatut)];
        strcpy(statut, paramStatut);
        nationalite = new char[strlen(paramNation)];
        strcpy(nationalite, paramNation);
      }
    voilà les elements de travail

  16. #16
    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
    Il suffit d'avoir une fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ostream &operator<<(ostream &os, const Etudiant &etu)
    de définie pour afficher un Etudiant, comme tu l'as fait pour Personne.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    class Etudiant
    {
    /* ... */
    	friend ostream &operator<<(ostream &os, const Etudiant &etu)
    	{
    		os << reinterpret_cast<const Personne&>(etu);
    		os << num_inscript << " " << statut << ", " << nationalite << endl;
    		return os;
    	}
    /* ... */
    };
    Edit : ça ne gérera pas le polymorphisme par contre.
    En fait avec ton code ça devrait marcher pour ça. C'est quoi l'erreur que tu obtiens exactement ?

  17. #17
    Membre averti
    Inscrit en
    Février 2006
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 16
    Par défaut
    >Edit : ça ne gérera pas le polymorphisme par contre.
    >En fait avec ton code ça devrait marcher pour ça. C'est quoi l'erreur que tu >obtiens exactement ?

    [Warning] cannot pass objects of non-POD type `class Etudiant' through `...'; call will abort at runtime

  18. #18
    Membre averti
    Inscrit en
    Février 2006
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 16
    Par défaut
    erreur de frappe!
    ça renvoie la fenêtre (après avoir ecrit Bienvenue) :
    L'instruction à "0x7c9446d" emploe l'adresse memoire "0xffffffff". La memoire ne peut pas être "read".

  19. #19
    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
    Pour afficher tes objets en tous cas il faut suivre ce modèle qui fonctionne.
    Ton bug vient sûrement d'ailleurs.

    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
    #include <iostream>
     
    class Foo
    {
    public:
     
        virtual void print(std::ostream &os) const
        {
            os << "foo";
        }
     
        friend std::ostream &operator<<(std::ostream &os, const Foo &foo)
        {
            foo.print(os);
            return os;
        }
    };
     
    class Bar : public Foo
    {
    public:
     
        virtual void print(std::ostream &os) const
        {
            os << " bar";
        }
    };
     
    int main()
    {
        Bar bar;
        std::cout << bar << std::endl;
    }

  20. #20
    Membre averti
    Inscrit en
    Février 2006
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 16
    Par défaut
    merci! c'est ce modèle j'ai en effet : vois mon code pour personne (classe mère et etudiant (classe fille)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    // personne.h
    friend ostream& operator << (ostream& O, const Personne& Pers) { 
        Pers.print(O); 
        return O; 
      }; //surcharge de l'operateur <<
      virtual void print(ostream& O) const{
        O << prenom << " " << nom << ", " << ne_en << " " << adresse << endl;
      }; // surcharge pr afficher les attributs de Personne
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    // etudiant.h
    virtual void print(ostream& O) const{
         Personne::print(O);
         O << num_inscript << " " << statut << ", " << nationalite << endl;
      }; // affiche etudiant
    pris individuelement mon programme marche, i.e je crée des étudiants et je les affiche sans problèmes, pour la liste ça marche avec les types int, float, double, string
    et quand je combine plantage!!! je suis vraiment perdu ds tout ça!

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [SQL] Problème avec liste déroulante et select
    Par cari dans le forum PHP & Base de données
    Réponses: 15
    Dernier message: 28/07/2006, 20h52
  2. Problème avec listes déroulantes
    Par dl_jarod dans le forum Langage
    Réponses: 9
    Dernier message: 07/06/2006, 10h13
  3. [VB6] boucle for avec liste de valeur defini
    Par Morpheus2144 dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 06/04/2006, 18h12
  4. Problème avec liste déroulante
    Par Invité dans le forum IHM
    Réponses: 2
    Dernier message: 14/12/2005, 21h04
  5. Problème avec listes liées entre elles et bouton "précé
    Par Oluha dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 02/08/2005, 15h10

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