Templates

cs_ymerej Messages postés 165 Date d'inscription vendredi 9 avril 2004 Statut Membre Dernière intervention 5 octobre 2007 - 19 oct. 2004 à 20:08
cs_ymerej Messages postés 165 Date d'inscription vendredi 9 avril 2004 Statut Membre Dernière intervention 5 octobre 2007 - 20 oct. 2004 à 17:38
Bonjour à tous,
ce TP est à rendre pour demain donc j'espere avoir une réponse ce soir.
Le sujet du TP C++ est simple, ecrire 2 classes : liste et maillons.
Le maillon contient un champ :
int data

donc çà marche mais tt c compliqué quand il a fallu tout passer en classe générique ie :
T data

Je n'ai aucune erreur de compilation, mais plusieurs dans les liens.
Ca ne doit vraiment pas etre grand chose.
Je vous poste le debut de chaque fichier, a mon avis c surtout lors des inclusions que ca ne va pas alors que ca marhait tres bien sans les templates
Merci d'avance.

-------------------------------------------------------------------------------------
//fichier maillon.h

#ifndef MAILLON_H
#define MAILLON_H

// Classe maillon
template <class T>
class maillon {

private:

T data ;
maillon<T>* suivant ;


public:

// Forme canonique de Coplien
maillon() ;
maillon(const T&);
maillon(const maillon<T>&) ;
~maillon() ;
maillon<T>& operator=(const maillon<T>&) ;

// Accesseurs
T get_data(){return data;}//fonction inline
maillon<T>* get_suivant(){return suivant;}//fonction inline

// Mutateurs
void set_data(T d){data = d;}
void set_suivant(maillon<T>* m){suivant = m;}
};

#endif

-------------------------------------------------------------------------------------
//fichier maillon.cc

#include "maillon.h"
#include

//constructeur par defaut
template <class T>
maillon<T>::maillon()
{
suivant = NULL;
}

//constructeur pour initialiser la data
template <class T>
maillon<T>::maillon(const T& d)
{
data = d;
suivant = NULL;

}

//constructeur par copie
template <class T>
maillon<T>::maillon(const maillon<T>& m)
{
data = m.data;
suivant = m.suivant;

}

--------------------------------------------------------------------------------------
// fichier liste.h

//liste.h
#ifndef LISTE_H
#define LISTE_H

#include "maillon.h"
#include

// Classe liste
template <class T>
class liste {

private:

maillon<T> *tete,*courant, *fin ;
int nb;


public:

// Forme canonique de Coplien
liste() ;
liste(const liste<T>&);
~liste(){supprime();}
liste<T>& operator=(const liste<T>&) ;

// Ajout de maillons
liste<T>& operator+ (const T&) ;
liste<T>& operator+ (const maillon<T>&) ;
liste<T>& operator+ (const liste<T>&) ;

// Suppression de maillons
// liste<T>& operator- (const T&) ; // suppression de la premiere occurence de T
liste<T>& operator- (int) ; // suppression du maillon d'indice donne

// Suppression
liste<T>& supprime_tete() ; // supprime la tete de la liste
liste<T>& supprime() ; // supprime tous les elements de la liste

// Entrees-sorties
void affiche () ;
friend ostream& operator<<(ostream&,liste<T>&);

// Autres methodes et operateurs
liste<T>& insere_tete(const T& d);
liste<T>& insere(const maillon<T>&, int); // les maillons sont numérotés de 0 à nb-1
// insertion d'un maillon à un indice donné
};

#endif

--------------------------------------------------------------------------------------
// fichier liste.cc

#include "liste.h"
#include

/*-------------------------------------------
CONSTRUCTEURS
-------------------------------------------*/

//par defaut
template <class T>
liste<T>::liste()
{
nb = 0; tete fin courant = NULL;
}

//de recopie
template <class T>
liste<T>::liste(const liste<T>& l):tete(NULL),fin(NULL),courant(NULL),nb(l.nb)
{
*this + l;
}

-------------------------------------------------------------------------------------
//fichier client.cc qui teste les 2 classes

#include <stdio.h>
#include
#include "liste.h"

int main(int argc, char* argv[])
{

cout << "Test TP2" << endl;

maillon m1(8); //on veut des maillons qui contiennent des int
maillon m2(13);
maillon m3(15);
maillon m4(9);
maillon m5(3);
maillon m6(1233);

liste l1;

cout << m1.get_data() << endl;

l1 + m1 + m2 + 25; // on ajoute deux maillons m1 et m2
// et un maillon qui aura 25 pour data
// à liste l1
l1.insere(m3,0);
l1.insere(m6,8); // insertion à un indice donné
l1.insere(m5,3);

l1.affiche();

l1 - 2; // on supprime le maillon à l'indice 2

cout << l1; // surcharge de << */

//pour eviter que la fenetre ne se referme à la fin de l'execution
char *s;
scanf("%s",s);

return 0;

}

31 réponses

cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
19 oct. 2004 à 20:32
c'est tout vu, le code template ne peut pas etre compilé séparement, donc mets la définitions des methodes dans le .h
0
leprov Messages postés 1160 Date d'inscription vendredi 23 juillet 2004 Statut Membre Dernière intervention 21 octobre 2010 17
19 oct. 2004 à 20:33
c quoi tes erreurs de link? ca aiderait.
en attendant que tu repondes je regarde ton code
0
leprov Messages postés 1160 Date d'inscription vendredi 23 juillet 2004 Statut Membre Dernière intervention 21 octobre 2010 17
19 oct. 2004 à 20:34
erf ah effectivement.
0
cs_ymerej Messages postés 165 Date d'inscription vendredi 9 avril 2004 Statut Membre Dernière intervention 5 octobre 2007
19 oct. 2004 à 21:03
Voilà les erreurs de liens que ca me fait :

c:\documents and settings\jeremy\mes documents\travaux personnels\informatique\gi01\lo43\tp2\templates\client.o(.text+0x63):client.cc: undefined reference to `maillon::maillon(int const &)'
c:\documents and settings\jeremy\mes documents\travaux personnels\informatique\gi01\lo43\tp2\templates\client.o(.text+0x7a):client.cc: undefined reference to `maillon::~maillon(void)'
c:\documents and settings\jeremy\mes documents\travaux personnels\informatique\gi01\lo43\tp2\templates\client.o(.text+0x9c):client.cc: undefined reference to `maillon::maillon(int const &)'
c:\documents and settings\jeremy\mes documents\travaux personnels\informatique\gi01\lo43\tp2\templates\client.o(.text+0xb3):client.cc: undefined reference to `maillon::~maillon(void)'
c:\documents and settings\jeremy\mes documents\travaux personnels\informatique\gi01\lo43\tp2\templates\client.o(.text+0xd5):client.cc: undefined reference to `maillon::maillon(int const &)'
c:\documents and settings\jeremy\mes documents\travaux personnels\informatique\gi01\lo43\tp2\templates\client.o(.text+0xec):client.cc: undefined reference to `maillon::~maillon(void)'
c:\documents and settings\jeremy\mes documents\travaux personnels\informatique\gi01\lo43\tp2\templates\client.o(.text+0x10e):client.cc: undefined reference to `maillon::maillon(int const &)'
c:\documents and settings\jeremy\mes documents\travaux personnels\informatique\gi01\lo43\tp2\templates\client.o(.text+0x125):client.cc: undefined reference to `maillon::~maillon(void)'
c:\documents and settings\jeremy\mes documents\travaux personnels\informatique\gi01\lo43\tp2\templates\client.o(.text+0x150):client.cc: undefined reference to `maillon::maillon(int const &)'
c:\documents and settings\jeremy\mes documents\travaux personnels\informatique\gi01\lo43\tp2\templates\client.o(.text+0x16d):client.cc: undefined reference to `maillon::~maillon(void)'
c:\documents and settings\jeremy\mes documents\travaux personnels\informatique\gi01\lo43\tp2\templates\client.o(.text+0x1a1):client.cc: undefined reference to `maillon::maillon(int const &)'
c:\documents and settings\jeremy\mes documents\travaux personnels\informatique\gi01\lo43\tp2\templates\client.o(.text+0x1be):client.cc: undefined reference to `maillon::~maillon(void)'
c:\documents and settings\jeremy\mes documents\travaux personnels\informatique\gi01\lo43\tp2\templates\client.o(.text+0x1e1):client.cc: undefined reference to `liste::liste(void)'
c:\documents and settings\jeremy\mes documents\travaux personnels\informatique\gi01\lo43\tp2\templates\client.o(.text+0x275):client.cc: undefined reference to `liste::operator+(maillon const &)'
c:\documents and settings\jeremy\mes documents\travaux personnels\informatique\gi01\lo43\tp2\templates\client.o(.text+0x280):client.cc: undefined reference to `liste::operator+(maillon const &)'
c:\documents and settings\jeremy\mes documents\travaux personnels\informatique\gi01\lo43\tp2\templates\client.o(.text+0x28b):client.cc: undefined reference to `liste::operator+(int const &)'
c:\documents and settings\jeremy\mes documents\travaux personnels\informatique\gi01\lo43\tp2\templates\client.o(.text+0x2a3):client.cc: undefined reference to `liste::insere(maillon const &, int)'
c:\documents and settings\jeremy\mes documents\travaux personnels\informatique\gi01\lo43\tp2\templates\client.o(.text+0x2be):client.cc: undefined reference to `liste::insere(maillon const &, int)'
c:\documents and settings\jeremy\mes documents\travaux personnels\informatique\gi01\lo43\tp2\templates\client.o(.text+0x2d9):client.cc: undefined reference to `liste::insere(maillon const &, int)'
c:\documents and settings\jeremy\mes documents\travaux personnels\informatique\gi01\lo43\tp2\templates\client.o(.text+0x2eb):client.cc: undefined reference to `liste::affiche(void)'
c:\documents and settings\jeremy\mes documents\travaux personnels\informatique\gi01\lo43\tp2\templates\client.o(.text+0x2ff):client.cc: undefined reference to `liste::operator-(int)'
c:\documents and settings\jeremy\mes documents\travaux personnels\informatique\gi01\lo43\tp2\templates\client.o(.text+0x316):client.cc: undefined reference to `operator<<(ostream &, liste &)'
c:\documents and settings\jeremy\mes documents\travaux personnels\informatique\gi01\lo43\tp2\templates\client.o(.text+0x371):client.cc: undefined reference to `maillon::~maillon(void)'
c:\documents and settings\jeremy\mes documents\travaux personnels\informatique\gi01\lo43\tp2\templates\client.o(.text+0x393):client.cc: undefined reference to `maillon::~maillon(void)'
c:\documents and settings\jeremy\mes documents\travaux personnels\informatique\gi01\lo43\tp2\templates\client.o(.text+0x3b2):client.cc: undefined reference to `maillon::~maillon(void)'
c:\documents and settings\jeremy\mes documents\travaux personnels\informatique\gi01\lo43\tp2\templates\client.o(.text+0x3d1):client.cc: undefined reference to `maillon::~maillon(void)'
c:\documents and settings\jeremy\mes documents\travaux personnels\informatique\gi01\lo43\tp2\templates\client.o(.text+0x3f0):client.cc: undefined reference to `maillon::~maillon(void)'
c:\documents and settings\jeremy\mes documents\travaux personnels\informatique\gi01\lo43\tp2\templates\client.o(.text+0x40f):client.cc: more undefined references to `maillon::~maillon(void)' follow
c:\documents and settings\jeremy\mes documents\travaux personnels\informatique\gi01\lo43\tp2\templates\client.o(.text$_$_t5liste1Zi+0x13):client.cc: undefined reference to `liste::supprime(void)'
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_ymerej Messages postés 165 Date d'inscription vendredi 9 avril 2004 Statut Membre Dernière intervention 5 octobre 2007
19 oct. 2004 à 21:05
Donc d'apres doit djl je dois plus me servir des .cc et tout mettre dans le .h ??
Mzis on perd ainsi le concept d'encapsulation, C pas terrible, ya pas d'autres solutions ?
J'attend avec impatience ta réponse.
A tout à l'heure...
0
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
19 oct. 2004 à 21:06
on avais compris :)

apres ces erreurs de liens sont assez explicites
0
leprov Messages postés 1160 Date d'inscription vendredi 23 juillet 2004 Statut Membre Dernière intervention 21 octobre 2010 17
19 oct. 2004 à 21:09
bah pour mettre les corps des fichiers autre part que direct ds le .h, en c++ on crée des .hpp, ou hxx, ou ce que tu veux qui donne un mix en .h et ".c++":
tu met les declarations ds ton .h, a la fin du .h tu inclus le .hpp
dans le hpp tu met tes corps comme ds un cpp mais en gardant tous les concepts de ton .h: directives d'inclusion conditionnelles, pas de using namespaces, etc...
0
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
19 oct. 2004 à 21:10
ymerej > tu perds rien en encapsulations, ca concerne juste la localisation du code

ce qu'il faut comprendre, c'est que si tu veux que le compilo puisse générer le code, la définition des méthodes doit etre connu a la compilation donc

soit tu mets tout dans le fichier d'entete apres la déclarations de la classes (ca se faist, voir la stl), soit tu mets ca dans un autre fichier (si tu y tien) que tu inclus apres la déclaration de la classe

mais la premeire solution est la plus commune
0
cs_ymerej Messages postés 165 Date d'inscription vendredi 9 avril 2004 Statut Membre Dernière intervention 5 octobre 2007
19 oct. 2004 à 21:11
Merci leprov mais un peu trop compliqué.
Car ce programme c'est pour un TP que je dois le rendre et on nous a jamais parlé de hpp etc.. dc ca va pas leur plair je pense.
Merci quand même
0
leprov Messages postés 1160 Date d'inscription vendredi 23 juillet 2004 Statut Membre Dernière intervention 21 octobre 2010 17
19 oct. 2004 à 21:13
le probleme de mettre ton code ds le .h se trouvera plus tard a la compilation, si tu met ds un hpp tu enleve completement ca. la tu risque d'avoir des probleme de link....
0
cs_ymerej Messages postés 165 Date d'inscription vendredi 9 avril 2004 Statut Membre Dernière intervention 5 octobre 2007
19 oct. 2004 à 21:14
djl > merci je vais essayer de mettre le maillon.cc dans le .h puis le liste.cc dans le .h tout a l'heure car avant j'ai plusieurs exos en Intelligence Artificielle.
0
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
19 oct. 2004 à 21:16
mets tout dans le fichier d'entete et on en parle plus
0
cs_ymerej Messages postés 165 Date d'inscription vendredi 9 avril 2004 Statut Membre Dernière intervention 5 octobre 2007
19 oct. 2004 à 21:17
Oula ca cmmence a faire du charabia là mais merci quand même jdl et leprov.
J'essaies çà tt a l'heure apres mon IA et je vous redis.
J'espere que vous serez dans les parages car a mon avis, ca ne marchera pas du premier coup.

Par contre leprov, je ne comprend pas la difference entre un .cpp (ou.cc) et un .hpp
et pourquoi dis tu que si je met tout dans le .h ca va me donner une erreur de compilation ?
Jdl es tu ok avec leprov sur cela ?
0
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
19 oct. 2004 à 21:22
non, mais je sais pas vraiement ce que voulais dire leprov

et c'est djl, pas jdl
0
cs_ymerej Messages postés 165 Date d'inscription vendredi 9 avril 2004 Statut Membre Dernière intervention 5 octobre 2007
19 oct. 2004 à 21:34
Ah oui lol pardon excuse moi djl
0
leprov Messages postés 1160 Date d'inscription vendredi 23 juillet 2004 Statut Membre Dernière intervention 21 octobre 2010 17
19 oct. 2004 à 22:50
tu met les corps des fonctions ds ton .h et tu fais ca:

fic1.cpp

#include <def.h>

fic2.cpp

#include <def.h>

et tu compiles les deux fichiers ensemble, tu te prend une erreur de link : multiple définition.

alors que si tu met que tes declarations dans ton .h et que ds ton .h tu inclus le .hpp qui contient les codes, pas de problemes
0
cs_ymerej Messages postés 165 Date d'inscription vendredi 9 avril 2004 Statut Membre Dernière intervention 5 octobre 2007
19 oct. 2004 à 22:53
ben non :
G mis maillon.cc dans maillon.h
liste.cc dans liste.h et je n'ai pas d'erreur de compilation car j'ai bien pensé a virer les .cc il ne me servent plus donc je les vire sinon evidemment ya une multiple definition.
0
leprov Messages postés 1160 Date d'inscription vendredi 23 juillet 2004 Statut Membre Dernière intervention 21 octobre 2010 17
19 oct. 2004 à 22:55
non tas pas compris......
si tu fais deux .cc qui tous les deux incluent liste.h et que tes deux .cc sont compilés ds le meme prog tauras un multiple definition, donc faut éviter de mettre le def de fonctions ds ton .h
0
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
19 oct. 2004 à 23:01
leprov > ou tu veux en venir ? les #ifndef protegent de la multiple définition

et les sources sont compilés séparément
0
leprov Messages postés 1160 Date d'inscription vendredi 23 juillet 2004 Statut Membre Dernière intervention 21 octobre 2010 17
19 oct. 2004 à 23:04
test djl, meme avec les ifndef tu te le taperas....ya pas photo
fait une classe, inclus la dans deux fichiers cpp et compile....tu verras, meme avec tes directives de compil conditionnelle tu te tape la double definition.....
0
Rejoignez-nous