Probleme de pointeur et de class

Probleme de pointeur et de class - Programmation

Marsh Posté le 17-04-2002 à 17:18:18    

J ai recu cette classe tel quelle a un cour mais j ai qq probleme ...  voir + bas !!!
 
Il me fait des erreurs aves mes constante NULL voir message plus bas  
 
D'avance merci  
 
Mon prog principal:  
#include "arbre2PL.h"  
 
void main()  
{  
Arbre2<int> A;  
}  
 
template <class Elem>  
class Arbre2 {  
class Noeud {  
friend class Arbre2<Elem>;  
Elem info;  
Noeud *pere, *fg, *fd;  
Noeud (const Elem& E, Noeud* P=NULL, Noeud* G=NULL, Noeud* D=NULL):  
info(E), pere(P), fg(G), fd(D) {}  
};  
public:  
typedef Noeud* Place;  
private:  
Place rac;  
inline static Place Copy (Place, Place = NULL);  
inline static void Cancel(Place&);  
public:  
bool Existe (Place p) const {return p != NULL;}  
Place Rac () const {return rac;}  
Place Pere (Place p) const {return p->pere;}  
Place FilsG (Place p) const {return p->fg;}  
Place FilsD (Place p) const {return p->fd;}  
Elem& operator[] (Place p) {return p->info;}  
void InsG (const Elem& E, Place p) {Cancel(p->fg); p->fg = new Noeud(E, p);}  
void InsD (const Elem& E, Place p) {Cancel(p->fd); p->fd = new Noeud(E, p);}  
void InsG (const Arbre2& A, Place p) {Cancel(p->fg); p->fg = Copy(A.rac, p);}  
void InsD (const Arbre2& A, Place p) {Cancel(p->fd); p->fd = Copy(A.rac, p);}  
void SupG (Place p) {Cancel(p->fg);}  
void SupD (Place p) {Cancel(p->fd);}  
// Constructeurs  
Arbre2 (const Elem& E): rac(new Noeud(E)) {}  
Arbre2 (): rac(NULL) {}  
Arbre2 (const Arbre2& A, Place p): rac(Copy(p)) {}  
Arbre2 (const Arbre2& A): rac(Copy(A.rac)) {}  
Arbre2& operator= (const Arbre2& A) {  
if (this != &A) {Cancel(rac); rac = Copy(A.rac);}  
return *this;  
}  
~Arbre2 () {Cancel(rac);}  
};  
 
template <class Elem>  
Arbre2<Elem>::Place Arbre2<Elem>::Copy (Place s, Place p) {  
Place f = NULL;  
if (s) {  
f = new Noeud(s->info, p);  
f->fg = Copy(s->fg, f);  
f->fd = Copy(s->fd, f);  
}  
return f;  
}  
 
template <class Elem>  
void Arbre2<Elem>::Cancel (Place& p) {  
if (p) {  
Cancel(p->fg);  
Cancel(p->fd);  
delete p; p = NULL;  
}  
}

 

[jfdsdjhfuetppo]--Message édité par The big ben--[/jfdsdjhfuetppo]

Reply

Marsh Posté le 17-04-2002 à 17:18:18   

Reply

Marsh Posté le 17-04-2002 à 17:26:17    

on pourrait avoir le message d'erreur exacte :??:


---------------
J'suis timide - Prêt à mourir, mais pas à vivre - Je suis vraiement très fatigué ... - more than meets the eye
Reply

Marsh Posté le 17-04-2002 à 17:32:03    

Dans borlan : ARBRE2PL.H(10,17):undefined symbol 'NULL'
idem au (17,17); (20,17)  (donc dans la meme ligne)
et au (34,17) (donc a la ligne:   Arbre2 (): rac(NULL) {})

Reply

Marsh Posté le 17-04-2002 à 20:01:04    

y a un include qui manque : stdio.h

Reply

Marsh Posté le 17-04-2002 à 22:00:39    

Remplace tes NULL par des 0.
En passant, NULL est defini comme un char* en C++, mieux vaut donc utiliser 0 pour éviter des pb de transtypage.


---------------
Le Tyran
Reply

Marsh Posté le 18-04-2002 à 11:27:41    

Un super grand merci aparament sa fonctionne !!!!!   :)  :)  :)

Reply

Marsh Posté le 18-04-2002 à 11:30:14    

Si non effectivement il doit te manquer un #include qq part.


---------------
Le Tyran
Reply

Marsh Posté le 18-04-2002 à 11:43:01    

Mais maintenant j ai un autre probleme comment dans mon prog principal puis je sauvgarder la valeur revoyée par Rac() par exemple Car il revoie un pointeur de type place est ce que je peu me définire un pointeur de type place dans mon prog principal ????    si oui comment ???

Reply

Marsh Posté le 18-04-2002 à 11:56:17    

Place *placePtr


---------------
Le Tyran
Reply

Marsh Posté le 18-04-2002 à 12:16:49    

C est pour les cours et je ne peu pas modifier la class !!! c'est ca mon probleme !!!!!

Reply

Marsh Posté le 18-04-2002 à 12:16:49   

Reply

Marsh Posté le 18-04-2002 à 12:19:57    

Je vois pas le raport.


---------------
Le Tyran
Reply

Marsh Posté le 18-04-2002 à 12:22:23    

mais dans mon prog princ il ne connais pas Place  vu que c'est interne a ma class !!!

Reply

Marsh Posté le 18-04-2002 à 12:24:57    

Elle est défini où ta classe?


---------------
Le Tyran
Reply

Marsh Posté le 18-04-2002 à 12:28:02    

la class est défini en dehors de la fonction main ! (logique )

Reply

Marsh Posté le 18-04-2002 à 12:30:05    

Certe, mais dans quels fichiers?


---------------
Le Tyran
Reply

Marsh Posté le 18-04-2002 à 12:34:46    

dans un fichier *.h ( header ! )  
 
donc je résume! on nous donne un fichier *.h avec une class Noeud imbriqué dans une class Arbre2...
 
et on doit faire une fonction de  parcours de préordre en dehors de la class => donc dans un autre fichier *.cpp où on doit faire un #include "Arbre2.h"  
 
voila!

 

[jfdsdjhfuetppo]--Message édité par EarthTrAsh--[/jfdsdjhfuetppo]


---------------
Ke jsuis movais en programmation
Reply

Marsh Posté le 18-04-2002 à 12:40:38    

Je vois pas ou est le pb.
 
Dans ton prog principale tu fais:
 
Arbre2        monArbre;
Arbre2::Place resultat;
 
resultat = monArbre.Rac();


---------------
Le Tyran
Reply

Marsh Posté le 18-04-2002 à 12:41:56    

heu c koi cet icon ????  :lol:  :lol:  :lol:  ca gache le paysage !!
 
  :??:  :??:  y en a plus  !!!

 

[jfdsdjhfuetppo]--Message édité par EarthTrAsh--[/jfdsdjhfuetppo]


---------------
Ke jsuis movais en programmation
Reply

Marsh Posté le 18-04-2002 à 12:48:25    

heu ca va po!  
il met com msg d'error :  type name expected
 
g mis  
 
Arbre2<Elem>        monArbre;  
Arbre2<Elem>::Place resultat;  
 
car sinon il accepte po


---------------
Ke jsuis movais en programmation
Reply

Marsh Posté le 18-04-2002 à 12:54:31    

Autant pour moi, pas vu qye ct une classe template. Fais plutôt ça alors:
 
typedef Arbre2<int> ArbreInt; //On va se faire un arbre d'entier c
                           //pas trop compliqué
 
typedef ArbreInt::Place PlaceInt;
 
ArbreInt monArbre;
PlaceInt resultat;
 
resultata = monArbre.Rac();


---------------
Le Tyran
Reply

Marsh Posté le 18-04-2002 à 12:59:42    

je le met ou ? dans le fct main()  ??
 
oki c fait ! ca marche mais ! tu peux po expliqué  
 le 2èm typedef  ??( juste pour voir si g bien compris )  
 
une dernière question !! ca se fais souvent ce genre de typedef ????

 

[jfdsdjhfuetppo]--Message édité par EarthTrAsh--[/jfdsdjhfuetppo]


---------------
Ke jsuis movais en programmation
Reply

Marsh Posté le 18-04-2002 à 13:05:21    

#include "Arbre2.h"
 
typedef Arbre2<int> ArbreInt;  
typedef ArbreInt::Place PlaceInt;  
 
int main(int,char**)
{
ArbreInt monArbre;  
 
//Création de l'arbre
 
PlaceInt resultat;  
 
resultata = monArbre.Rac();  
 
return 0;
}


---------------
Le Tyran
Reply

Marsh Posté le 18-04-2002 à 13:13:38    

oki c fait ! ca marche mais ! tu peux po expliqué  
le 2èm typedef  ??( juste pour voir si g bien compris )  
 
une question,ca se fais souvent ce genre de typedef ????
 
et c normale si il me sort un résultat en héxa ??? Ox.....

 

[jfdsdjhfuetppo]--Message édité par EarthTrAsh--[/jfdsdjhfuetppo]


---------------
Ke jsuis movais en programmation
Reply

Marsh Posté le 18-04-2002 à 13:20:33    

Le premier typedef permet d'instancier le template. Le deuxième est juste "un racourci" pour accéder à la classe Place, c'est pour éviter d'avoir à écrire à chaque fois AbreInt::Place.
 
On a à faire des typedef de ce style dés qu'on commence à faire des trucs avec les templates.


---------------
Le Tyran
Reply

Marsh Posté le 18-04-2002 à 13:27:22    

eu ca veut dire koi  " instancier " ??
et Place c po une class  mais un typedef de Noeud* ( typedef Noeud* Place;   :non: )
 
enfin  un très grand grand merci !!


---------------
Ke jsuis movais en programmation
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed