Besoin d'aide sur un conteneur pour arbre binaire

Besoin d'aide sur un conteneur pour arbre binaire - C++ - Programmation

Marsh Posté le 12-11-2007 à 21:17:53    

Salut,
 
je suis en train un arbre binaire mais je ne suis pas sûr que je m'y prend bien.
 
Mon noeud le plus haut, A, contient un string et 2 pointeurs. Ces pointeurs peuvent être des A* ou des B*.
 
Pour l'instant je partais sur une union avec chaque classe qui possède un type, mais je me demande si c'est vraiment intelligent. Les 2 classes n'ont rien en rapport à part que A peut avoir un pointeur sur B donc l'héritage me parait inutile mais je peux me tromper.
 
En gros pour l'instant j'ai
 
Class A
{
public:
....
 
private:
MonType _type
union{
A* _a;
B* _b
} child1;
union{
A* _a;
B* _b
} child2;
string _toto
};
 
ca parait super lourd comme cela... surtout qu'après faudra tester le _type pour savoir sur quoi je tappe et tout mais je ne sais pas trop comment m'en sortir sinon.
 
Si ca vous parle  [:cerveau perchut2]  
 
Merci


---------------
"Phildar t'es vraiment une pute pas finie toi! Et Manu le gros porc arrete de t'marrer!"
Reply

Marsh Posté le 12-11-2007 à 21:17:53   

Reply

Marsh Posté le 13-11-2007 à 08:02:44    

Contenir des A ou des B : boost::variant
http://boost.org/doc/html/variant/tutorial.html

 

Ensuite, t'as aussi le droit de faire hériter A et B d'une même classe abstraite, de stocker des poinetrus vers cette classe mére et de te servir du polymorphisme de classe :o
L'héritage ici n'est PAS inutile. A et B ont quelquchose en commun : être des fils de ton arbre binaire.

 

Dis toi que si tu commences à devoir avoir une variable qui indique le type d'une classe, tu es sur la mauvaise voie car tu réinvente la roue :o


Message édité par Joel F le 13-11-2007 à 08:04:15
Reply

Marsh Posté le 13-11-2007 à 18:50:48    

Oui je pensais à hériter d'une classe C, mais je me vois toujours obliger après de savoir sur quoi je tappe non?
Car je ne chercherai pas les mêmes données (en gros dans B j'ai les données, et dans A je chercherai B, remarque je peux mettre une fonction eval en virtuel).
 
Si tu as plus d'idées je prends :)
 
Merci


---------------
"Phildar t'es vraiment une pute pas finie toi! Et Manu le gros porc arrete de t'marrer!"
Reply

Marsh Posté le 13-11-2007 à 19:28:50    

punaise, dynamic_cast quoi :o c'est la base du polymorphisme.
 
Tu herite de C, tu transtype ton C* en A* avec dynamic_cast, si le cast renvoie pas NULL, c'ets bon, sinon c'est que c'est un B* :o

Reply

Marsh Posté le 13-11-2007 à 19:36:13    

ooh je ne connaissais pas ce truc.


---------------
"Phildar t'es vraiment une pute pas finie toi! Et Manu le gros porc arrete de t'marrer!"
Reply

Marsh Posté le 13-11-2007 à 19:38:29    

c'ets quoi le smiely [/QUOTED] deja :o

Reply

Marsh Posté le 13-11-2007 à 19:42:42    

aucune idée désolé :ange:


---------------
"Phildar t'es vraiment une pute pas finie toi! Et Manu le gros porc arrete de t'marrer!"
Reply

Marsh Posté le 13-11-2007 à 20:47:35    

J'ai regardé un peu ca a l'air pas mal en effet. Faudrait que je comprenne les 4 types de cast de ce genre :jap:

 

Sinon mon ami Joel, une autre question stupide pour toi. Quand je parcours mon arbre je peux avoir envie de garder en mémoire le noeud parent (ou le parent du parent si le parent ne m'interesse pas). Une solution est d'avoir une variable _current dans ma classe parser que je met à jour quand ca m'interesse. Les autres solutions sont l'envoie de variable à chaque fonction qui évalue les noeuds, ou bien traiter les données au niveau parent en récupérant les infos du noeud enfant par un retour.

 

Donc qu'est ce qui vaut mieux?
- _current
- void evalNode(Node* iParent)
- Node* evalNode()

 

J'aime bien le _current, je m'en sers souvent mais je ne sais pas si c'est intelligent. Le retour de donnée me fait probablement faire plus de travail mais à vérifier.


Message édité par gee le 13-11-2007 à 20:48:55

---------------
"Phildar t'es vraiment une pute pas finie toi! Et Manu le gros porc arrete de t'marrer!"
Reply

Marsh Posté le 14-11-2007 à 08:43:26    

Il est de bon ton de découpler SDD et algo de parcours.
Je t'invite à te renseigner sur le Design Pattern 'Visitor' :)

Reply

Marsh Posté le 14-11-2007 à 17:24:46    

J'ai regardé un peu mais je ne comprend pas le principe.
J'ai lu le lien http://en.wikipedia.org/wiki/Visitor_pattern
 
Le truc c'est que je ne vois pas à quoi servent les fonctions accept et visit.
En effet, le visiteur est envoyé à la donnée qui appelle le visiteur. Pourquoi le visiteur ne travaille pas sur la donnée directement? Je ne vois pas l'intéret (qui doit exister quelque part).
 
 
Merci


---------------
"Phildar t'es vraiment une pute pas finie toi! Et Manu le gros porc arrete de t'marrer!"
Reply

Marsh Posté le 14-11-2007 à 17:24:46   

Reply

Marsh Posté le 14-11-2007 à 18:41:05    

Ca permet de découpler les données des algo qui travaillent dessus.
Et découpler c'est comme s'accoupler, c'est que du bon :o
 

Citation :


Si déporter des opérations contenues dans une classe vers une autre peut sembler mauvais au sens POO, il y a de bonnes raisons pour le faire. En effet, si ces opérations sont identiques pour chaque classe au lieu de dupliquer cette méthode il est préférable de mettre ces opérations dans un visiteur (centralisation de l'opération). Le visiteur utilisera ensuite les données internes de chaque objet pour effectuer l'opération demandée.


 
A méditer

Reply

Marsh Posté le 14-11-2007 à 18:57:33    

Euh oui mais je ne comprend toujours pas  
 
Je veux dire je vois ce scénario:
- maclasse.accept(monvisiteur)
- monvisteur.visit(&this)
 
Je ne vois pas l'interet face à
monvisiteur.visit(&maclasse)


---------------
"Phildar t'es vraiment une pute pas finie toi! Et Manu le gros porc arrete de t'marrer!"
Reply

Marsh Posté le 14-11-2007 à 19:10:40    

En fait, il faut voir le Visiteur comme un foncteur que tu applique sur une classe. Semantiquement ca veut dire que tu créer une instance de ton visiteur que tu passe à ta classe Visitable. EN gros tu emules du Double Dsipatching, et ca, conceptuellement c'est gros.

Reply

Marsh Posté le 15-11-2007 à 08:35:07    

Autre truc : comment veut tu que visitor sache comment visité des visitable composites ? Soit tu delegue au visité (classe) soit tu doit faire X version du visiteur (pas classe)

Reply

Marsh Posté le 15-11-2007 à 17:30:54    

Pas compris la remarque là :??:


---------------
"Phildar t'es vraiment une pute pas finie toi! Et Manu le gros porc arrete de t'marrer!"
Reply

Marsh Posté le 15-11-2007 à 19:50:24    

regarde l'exempel avec la voiture composé de roue etc et essaye d'ecrire un visiteur avec ton interface qui reste générique ;)

Reply

Marsh Posté le 15-11-2007 à 20:24:38    

ok je tenterai cela toute à l'heure :jap:
J'imagine que je posterai ma réponse pendant que tu dormiras par contre ;)


---------------
"Phildar t'es vraiment une pute pas finie toi! Et Manu le gros porc arrete de t'marrer!"
Reply

Marsh Posté le 16-11-2007 à 23:26:51    

Bon je n'ai pas encore eu le temps de regarder cela.
Par contre pas de dynamic_cast sur un smartPointer ca fait mal :(


---------------
"Phildar t'es vraiment une pute pas finie toi! Et Manu le gros porc arrete de t'marrer!"
Reply

Marsh Posté le 17-11-2007 à 09:10:50    

bah faut utiliser un smart_ptr qui va bien :o

Reply

Marsh Posté le 19-11-2007 à 21:10:23    

mouem.
 
Sinon la difference de dynamic entre pointer et réference spa drôle je trouve :o


---------------
"Phildar t'es vraiment une pute pas finie toi! Et Manu le gros porc arrete de t'marrer!"
Reply

Marsh Posté le 27-11-2007 à 13:31:29    

Salut !
 
je vais ptêtre dire une connerie, mais il y a les boost::dynamic_pointer_cast pour faire des cast sur les smart pointer. Mais par contre il faut utiliser les smart pointer de boost...

Reply

Marsh Posté le 27-11-2007 à 14:11:19    

ce qui est pas une mauvaise idée en soi :)
Merci pr le reminder

Reply

Marsh Posté le 27-11-2007 à 17:26:39    

oui j'utilise les smart pointers de boost, et j'ai regardé vite fait le dynamic_pointer_cast ca avait l'air ok.
 
En fait un truc pas drôle avec les smart pointers boost c'est le cote ".get()->" ca ralourdit le code d'une force je trouve :( En fait il nous faudrait des smart references ;)


---------------
"Phildar t'es vraiment une pute pas finie toi! Et Manu le gros porc arrete de t'marrer!"
Reply

Marsh Posté le 27-11-2007 à 18:35:32    

sauf que par définition une référence est forcement smart [:dawa]

Reply

Marsh Posté le 27-11-2007 à 18:57:16    

Aaah et comment je fais pour associer un objet dynamique à une référence? :o
 
bon je peux faire
Object& ref = *ptr;
 
mais bon c'est laid non?


---------------
"Phildar t'es vraiment une pute pas finie toi! Et Manu le gros porc arrete de t'marrer!"
Reply

Marsh Posté le 27-11-2007 à 19:33:59    

sinon j'ai un vecteur de smart pointers là.
Pour remplacer un élément je peux simplement utiliser le []? ca détruira tout de même le smart pointer et son objet?


---------------
"Phildar t'es vraiment une pute pas finie toi! Et Manu le gros porc arrete de t'marrer!"
Reply

Marsh Posté le 27-11-2007 à 20:26:12    

gee a écrit :

Aaah et comment je fais pour associer un objet dynamique à une référence? :o
 
bon je peux faire
Object& ref = *ptr;
 
mais bon c'est laid non?


 
oui, surtout que une référence se comporte comme un pointeur vis à vis du polymorphisme ;)
 
Fille f;
Mere& m = f;
 
marche farpaitement

Reply

Marsh Posté le 27-11-2007 à 20:28:53    

Oh je ne savais pas pour le polymorphisme c'est pratique. Mais en fait je parle dans le cas suivant :

 

A* a = new A();

 

Je ne peux pas utiliser un B& en tant que "smart reference" (ie que l'objet meurt en même temps que la dernière référence) non?

 


Message édité par gee le 27-11-2007 à 20:29:44

---------------
"Phildar t'es vraiment une pute pas finie toi! Et Manu le gros porc arrete de t'marrer!"
Reply

Marsh Posté le 27-11-2007 à 21:10:22    

apres c'est à voir. J'ai pas les ref sous la main mais y avait un bon papier de Sutter sur les object lifetime qui resumait les bonnes pratiques

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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