christallis | Bonjour,
Tout d'abord, merci pour ta réponse.
Oui, en effet normalement le code d'un template doit être dans le header mais j'ai essayé de tout mettre dans le header (et aussi (même si c'est pareil) d'inclure le cxx à la fin du header) et ça ne change absolument rien à l'exécution.
Voici le main (enfin, la partie concernée qui est faite dans un fonction void).
Code :
- void main()
- {
- cout << "----- Test du template Vecteur avec des objets de la classe Collectionneur ------" << endl;
- cout << "Creation d'un vecteur de 5 cases..." << endl;
- Vecteur<Collectionneur> *p = new Vecteur<Collectionneur>(5);
- p->affiche();
- cout << endl;
-
- Collectionneur c1("Tombale","Pierre","07/10/1985","belge","tombalpi",3);
- Collectionneur c2("Coptere","Eli","25/03/1990","francais","copterel",4);
- cout << "L'element d'indice 2 devient Tombale" << endl;
- if (p->indiceValide(2)) p->setElement(2,c1);
- p->affiche();
- cout << endl;
-
- cout << "L'element d'indice 4 devient Coptere" << endl;
- if (p->indiceValide(4)) p->setElement(4,c2);
- p->affiche();
- cout << endl;
- cout << "On recupere l'element d'indice 2 (sans le retirer !!!)" << endl;
- if (p->indiceValide(2) && p->estOccupe(2))
- {
- Collectionneur c=p->getElement(2);
-
- cout << "Element recupere = " << c << endl;
- }
- else cout << "Case non occupee ou indice invalide !" << endl;
- cout << endl;
- cout << "On recupere l'element d'indice 3 (sans le retirer !!!)" << endl;
- if (p->indiceValide(3) && p->estOccupe(3)) // exception
- {
- Collectionneur c = p->getElement(3);
- cout << "Element recupere = " << c << endl;
- }
- else cout << "Case non occupee ou indice invalide !" << endl;
- cout << endl;
- p->affiche();
- cout << endl;
- cout << "On retire l'element d'indice 2" << endl;
- if (p->indiceValide(2) && p->estOccupe(2)) // exception
- {
- Collectionneur c = p->retireElement(2);
- cout << "Element recupere = " << c << endl;
- }
- else cout << "Case non occupee ou indice invalide !" << endl;
- cout << endl;
- p->affiche();
- cout << endl;
- cout << "On ajoute Issier en utilisant l'operateur +" << endl;
- // operator+ : Ajout dans la premiere case libre du vecteur
- (*p) + Collectionneur("Issier","Pol","21/06/1996","belge","issierpo",1);
- p->affiche();
-
- cout << "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" << endl;
- Collectionneur c("Sonite","Sam","11/01/1992","belge","sonitesa",6);
- c.affiche();
- cout << "On ajoute Sonite en utilisant l'operateur +" << endl;
- (*p) + c;
- p->affiche();
- cout << endl;
- delete p;
- }
|
En fait, il s'agit d'une hiérarchie de classe et chaque classe fille redéfinis brièvement l'opérateur << (en appelant celui de la classe mère).
Voici la hiérarchie dont fait partie la classe Collectionneur ;
Header de la classe Personne ;
Code :
- #ifndef PERSONNE_H
- #define PERSONNE_H
- #include <stdio.h>
- #include <stdlib.h>
- #include <iostream.h>
- class Personne
- {
- protected:
- char * Nom;
- char * Prenom;
- char * DateNaissance;
- char * Nationalite;
- char * id;
- public:
- //Constructeurs
- Personne();
- Personne(const char *TmpNom,const char *TmpPrenom,const char *TmpDateNaissance, const char *TmpNationalite);
- Personne(const Personne& Pers);
- //Surcharge d'operateurs
- friend istream& operator>>(istream& s, Personne& Pers);
- friend ostream& operator<<(ostream& s, const Personne& Pers);
- virtual void affiche();
- virtual char* getIdentification();
- //Setters
- void setNom(const char* TmpNom);
- void setPrenom(const char* TmpPrenom);
- void setDateNaissance(const char* TmpDateNaissance);
- void setNationalite(const char* TmpNationalite);
- //Getters
- char* getNom() const;
- char* getPrenom() const;
- char* getDateNaissance() const;
- char* getNationalite() const;
- //Destructeur
- virtual ~Personne();
- };
- #endif
|
Corps ;
Code :
- #include "Personne.h"
- //Constructeurs
- Personne::Personne()
- {
- Nom=NULL;
- Prenom=NULL;
- DateNaissance=NULL; //Il faudra sans doute remplacer ce champ par une classe Cdate.
- Nationalite=NULL;
- id=NULL;
- setNom("--" );
- setPrenom("--" );
- setDateNaissance("--/--/--" );
- setNationalite("--" );
- }
- Personne::Personne(const char* TmpNom,const char* TmpPrenom,const char* TmpDateNaissance,const char* TmpNationalite)
- {
- Nom=NULL;
- Prenom=NULL;
- DateNaissance=NULL;
- Nationalite=NULL;
- id=NULL;
- setNom(TmpNom);
- setPrenom(TmpPrenom);
- setDateNaissance(TmpDateNaissance);
- setNationalite(TmpNationalite);
- }
- Personne::Personne(const Personne& Pers)
- { Nom=NULL;
- Prenom=NULL;
- DateNaissance=NULL;
- Nationalite=NULL;
- id=NULL;
- setNom(Pers.getNom());
- setPrenom(Pers.getPrenom());
- setDateNaissance(Pers.getDateNaissance());
- setNationalite(Pers.getNationalite());
- }
- //Surcharge d'operateurs
- istream& operator>>(istream& s, Personne& Pers)
- {
- char Buffer[100];
- Pers.id=NULL;
- cout<<"Nom : ";
- s>>Buffer;
- Pers.setNom(Buffer);
- cout<<"Prenom : ";
- s>>Buffer;
- Pers.setPrenom(Buffer);
- cout<<"Date de naissance : ";
- s>>Buffer;
- Pers.setDateNaissance(Buffer);
- cout<<"Nationalite : ";
- s>>Buffer;
- Pers.setNationalite(Buffer);
- return s;
- }
- ostream& operator<<(ostream& s, const Personne& Pers)
- {
- cout << "OUT Personne" << endl;
- s<<"Nom : "<<Pers.getNom()<<endl;
- s<<"Prenom : "<<Pers.getPrenom()<<endl;
- s<<"Date de naissance : "<<Pers.getDateNaissance()<<endl;
- s<<"Nationalite : "<<Pers.getNationalite()<<endl;
- return s;
- }
- void Personne::affiche()
- {cout<<"Personne"<<endl;
- cout<<"Nom : "<<getNom()<<endl;
- cout<<"Prenom : "<<getPrenom()<<endl;
- cout<<"Date de naissance : "<<getDateNaissance()<<endl;
- cout<<"Nationalite : "<<getNationalite()<<endl;
- }
- char* Personne::getIdentification()
- {
- if(Nom)
- {
- int Nblettre = strlen(getNom());
- id = new char[Nblettre+1];
- strcpy(id, getNom());
- return id;
- }
- else
- {
- id = new char[3];
- strcpy(id,"--" );
- return id;
- }
- }
- //Setters
- void Personne::setNom(const char* TmpNom)
- {
- if(TmpNom)
- {
- int Nblettre;
- Nblettre = strlen(TmpNom);
- if(Nom) delete Nom;
- Nom = new char[Nblettre+1];
- strcpy(Nom, TmpNom);
- }
- else
- return;
- }
- void Personne::setPrenom(const char* TmpPrenom)
- {
- if(TmpPrenom)
- {
- int Nblettre;
- Nblettre = strlen(TmpPrenom);
- if(Prenom) delete Prenom;
- Prenom = new char[Nblettre+1];
- strcpy(Prenom, TmpPrenom);
- }
- else
- return;
- }
- void Personne::setDateNaissance(const char* TmpDateNaissance)
- {
- if(TmpDateNaissance)
- {
- int Nblettre;
- Nblettre = strlen(TmpDateNaissance);
- if(DateNaissance) delete DateNaissance;
- DateNaissance = new char[Nblettre+1];
- strcpy(DateNaissance, TmpDateNaissance);
- }
- else
- return;
- }
- void Personne::setNationalite(const char* TmpNationalite)
- {
- if(TmpNationalite)
- {
- int Nblettre;
- Nblettre = strlen(TmpNationalite);
- if(Nationalite) delete Nationalite;
- Nationalite = new char[Nblettre+1];
- strcpy(Nationalite, TmpNationalite);
- }
- else
- return;
- }
- //Getters
- char* Personne::getNom() const
- {
- return Nom;
- }
- char* Personne::getPrenom() const
- {
- return Prenom;
- }
- char* Personne::getDateNaissance() const
- {
- return DateNaissance;
- }
- char* Personne::getNationalite() const
- {
- return Nationalite;
- }
- //Destructeur
- Personne::~Personne()
- {
- if(Nom) delete Nom;
- if(Prenom) delete Prenom;
- if(DateNaissance) delete DateNaissance;
- if(Nationalite) delete Nationalite;
- if(id) delete id;
- }
|
Beaucoup de lignes superflues ont été ajoutée uniquement dans le but de tester/tracer. J'ai fais énormément de test avant de demander de l'aide.
Header de la classe AuthorisedPerson (Classe abstraite dérivée de Personne).
Code :
- #ifndef AUTHORIZEDPERSON_H
- #define AUTHORIZEDPERSON_H
- #include <iostream.h>
- #include <stdio.h>
- #include <stdlib.h>
- #include "Personne.h"
- class AuthorisedPerson : public Personne
- {
- protected:
- char * Login;
- public:
- AuthorisedPerson();
- AuthorisedPerson(const char* TmpNom, const char* TmpPrenom, const char* TmpDateNaissance, const char* TmpNationalite, const char* TmpLogin);
- AuthorisedPerson(const AuthorisedPerson& AuthPers);
- friend istream& operator>>(istream& s, AuthorisedPerson& AuthPers);
- friend ostream& operator<<(ostream& s, const AuthorisedPerson& AuthPers);
- virtual char* getIdentification() = 0;
- void setLogin(const char* TmpLogin);
- char* getLogin() const;
- virtual ~AuthorisedPerson();
- };
- #endif
|
Cxx ;
Code :
- #include "AuthorisedPerson.h"
- AuthorisedPerson::AuthorisedPerson() : Personne()
- {
- //Appel du constructeur par défaut de la classe Personne
- Login = NULL;
- setLogin("--" );
- }
- AuthorisedPerson::AuthorisedPerson(const char* TmpNom, const char* TmpPrenom, const char* TmpDateNaissance, const char* TmpNationalite, const char* TmpLogin) : Personne(TmpNom, TmpPrenom, TmpDateNaissance, TmpNationalite)
- {
- //Appel du constructeur d'initialisation de la classe Personne
- Login = NULL;
- setLogin(TmpLogin);
- }
- AuthorisedPerson::AuthorisedPerson(const AuthorisedPerson& AuthPers) : Personne((AuthorisedPerson& )AuthPers)
- {
- Login = NULL;
- setLogin(AuthPers.getLogin());
- }
- istream& operator>>(istream& s, AuthorisedPerson& AuthPers)
- {
- char TmpLogin[100];
- s>>(Personne& )AuthPers;
- cout<<"Login : ";
- s>>TmpLogin;
- AuthPers.setLogin(TmpLogin);
- return s;
- }
- ostream& operator<<(ostream& s, const AuthorisedPerson& AuthPers)
- {
- cout << "OUT author" << endl;
- s<<(Personne& )AuthPers;
- s<<"Login : "<<AuthPers.getLogin()<<endl;
- return s;
- }
- void AuthorisedPerson::setLogin(const char* TmpLogin)
- {
- if(TmpLogin)
- {
- int Nblettre;
- Nblettre = strlen(TmpLogin);
- if(Login) delete Login;
- Login = new char[Nblettre+1];
- strcpy(Login, TmpLogin);
- }
- else
- return;
- }
- char* AuthorisedPerson::getLogin() const
- {cout<<"Author"<<endl;
- return Login;
- }
- AuthorisedPerson::~AuthorisedPerson()
- {
- if(Login) delete Login;
- }
|
Header de la classe Collectionneur (suivit du corps) qui dérive de AuthorisedPerson
Code :
- #ifndef COLLECTIONNEUR_H
- #define COLLECTIONNEUR_H
- #include <stdio.h>
- #include <stdlib.h>
- #include <iostream.h>
- #include "AuthorisedPerson.h"
- class Collectionneur : public AuthorisedPerson
- {
- private:
- int NbCollections;
- public:
- //Constructeurs
- Collectionneur();
- Collectionneur(const char* TmpNom, const char* TmpPrenom, const char* TmpDateNaissance, const char* TmpNationalite, const char* TmpLogin, const int TmpNbCollections);
- Collectionneur(const Collectionneur& TmpCol);
- //Surcharges d'operateurs
- Collectionneur& operator=(const Collectionneur& TmpCol);
- friend istream& operator>>(istream& s, Collectionneur& Col);
- friend ostream& operator<<(ostream& s, const Collectionneur& Col);
- //Setter(s)
- void setNbCollections(const int TmpNbCollections);
- //Getter(s)
- int getNbCollections() const;
- void affiche();
- char* getIdentification();
- //~Collectionneur();
- };
- #endif
|
Collectionneur.cxx
Code :
- #include "Collectionneur.h"
- Collectionneur::Collectionneur() : AuthorisedPerson()
- {
- setNbCollections(0);
- }
- Collectionneur::Collectionneur(const char* TmpNom, const char* TmpPrenom, const char* TmpDateNaissance, const char* TmpNationalite, const char* TmpLogin, const int TmpNbCollections) : AuthorisedPerson(TmpNom, TmpPrenom, TmpDateNaissance, TmpNationalite, TmpLogin)
- {
- setNbCollections(TmpNbCollections);
- }
- Collectionneur::Collectionneur(const Collectionneur& TmpCol) : AuthorisedPerson((AuthorisedPerson& )TmpCol)
- {
- setNbCollections(TmpCol.getNbCollections());
- }
- Collectionneur& Collectionneur::operator=(const Collectionneur& TmpCol)
- {
- /*Nom=NULL;
- Prenom=NULL;
- DateNaissance=NULL;
- Nationalite=NULL;
- id=NULL;
- Login=NULL;*/
- setNom(TmpCol.getNom());
- setPrenom(TmpCol.getPrenom());
- setDateNaissance(TmpCol.getDateNaissance());
- setNationalite(TmpCol.getNationalite());
- setLogin(TmpCol.getLogin());
- setNbCollections(TmpCol.getNbCollections());
- return *this;
- }
- istream& operator>>(istream& s, Collectionneur& Col)
- {
- cout << "IN" << endl;
- int TmpCol=0;
- s>>(AuthorisedPerson& )Col;
- cout<<"Nombre de Collections : ";
- s>>TmpCol;
- Col.setNbCollections(TmpCol);
- return s;
- }
- ostream& operator<<(ostream& s, const Collectionneur& Col)
- {
- cout << "OUT collect" << endl;
- s<<(AuthorisedPerson& )Col;
- s<<"Nom : " << Col.getNom() << endl;
- s<<"Login : " << Col.getLogin() << endl;
- s<<"Nombre de collections : "<<Col.getNbCollections()<<endl;
- return s;
- }
- void Collectionneur::setNbCollections(const int TmpNbCollections)
- {
- if(TmpNbCollections >= 0) NbCollections = TmpNbCollections;
- else return;
- }
- int Collectionneur::getNbCollections() const
- {
- return NbCollections;
- }
- void Collectionneur::affiche()
- {cout<<"Collect"<<endl;
- Personne::affiche();
- cout<<"Login : "<<getLogin()<<endl;
- cout<<"Nombre de Collections : "<<getNbCollections()<<endl;
- }
- char* Collectionneur::getIdentification()
- {
- if(Nom)
- {
- int Nblettre = strlen(getNom());
- id = new char[Nblettre+10];
- sprintf(id, "COLLECTIONNEUR:%s#%d", getNom(),getNbCollections());
- return id;
- }
- else
- {
- id = new char[22];
- strcpy(id,"COLLECTIONNEUR:--#00" );
- return id;
- }
- }
|
Voilà, je rappel qu'il s'agit d'un cas d'école.
Merci de ton aide. Message édité par christallis le 06-11-2011 à 11:01:16
|