Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2953 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  Besoin d'aide sur un conteneur pour arbre binaire

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Besoin d'aide sur un conteneur pour arbre binaire

n°1641821
gee
Bon ben hon
Posté le 12-11-2007 à 21:17:53  profilanswer
 

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!"
mood
Publicité
Posté le 12-11-2007 à 21:17:53  profilanswer
 

n°1641941
Joel F
Real men use unique_ptr
Posté le 13-11-2007 à 08:02:44  profilanswer
 

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
n°1642382
gee
Bon ben hon
Posté le 13-11-2007 à 18:50:48  profilanswer
 

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!"
n°1642395
Joel F
Real men use unique_ptr
Posté le 13-11-2007 à 19:28:50  profilanswer
 

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

n°1642402
gee
Bon ben hon
Posté le 13-11-2007 à 19:36:13  profilanswer
 

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!"
n°1642405
Joel F
Real men use unique_ptr
Posté le 13-11-2007 à 19:38:29  profilanswer
 

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

n°1642408
gee
Bon ben hon
Posté le 13-11-2007 à 19:42:42  profilanswer
 

aucune idée désolé :ange:


---------------
"Phildar t'es vraiment une pute pas finie toi! Et Manu le gros porc arrete de t'marrer!"
n°1642429
gee
Bon ben hon
Posté le 13-11-2007 à 20:47:35  profilanswer
 

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!"
n°1642540
Joel F
Real men use unique_ptr
Posté le 14-11-2007 à 08:43:26  profilanswer
 

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

n°1642889
gee
Bon ben hon
Posté le 14-11-2007 à 17:24:46  profilanswer
 

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!"
mood
Publicité
Posté le 14-11-2007 à 17:24:46  profilanswer
 

n°1642931
Joel F
Real men use unique_ptr
Posté le 14-11-2007 à 18:41:05  profilanswer
 

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

n°1642937
gee
Bon ben hon
Posté le 14-11-2007 à 18:57:33  profilanswer
 

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!"
n°1642946
Joel F
Real men use unique_ptr
Posté le 14-11-2007 à 19:10:40  profilanswer
 

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.

n°1643142
Joel F
Real men use unique_ptr
Posté le 15-11-2007 à 08:35:07  profilanswer
 

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)

n°1643524
gee
Bon ben hon
Posté le 15-11-2007 à 17:30:54  profilanswer
 

Pas compris la remarque là :??:


---------------
"Phildar t'es vraiment une pute pas finie toi! Et Manu le gros porc arrete de t'marrer!"
n°1643608
Joel F
Real men use unique_ptr
Posté le 15-11-2007 à 19:50:24  profilanswer
 

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

n°1643621
gee
Bon ben hon
Posté le 15-11-2007 à 20:24:38  profilanswer
 

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!"
n°1644286
gee
Bon ben hon
Posté le 16-11-2007 à 23:26:51  profilanswer
 

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!"
n°1644330
Joel F
Real men use unique_ptr
Posté le 17-11-2007 à 09:10:50  profilanswer
 

bah faut utiliser un smart_ptr qui va bien :o

n°1645496
gee
Bon ben hon
Posté le 19-11-2007 à 21:10:23  profilanswer
 

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!"
n°1649592
Amonchakai
Posté le 27-11-2007 à 13:31:29  profilanswer
 

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...

n°1649634
Joel F
Real men use unique_ptr
Posté le 27-11-2007 à 14:11:19  profilanswer
 

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

n°1649782
gee
Bon ben hon
Posté le 27-11-2007 à 17:26:39  profilanswer
 

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!"
n°1649813
Joel F
Real men use unique_ptr
Posté le 27-11-2007 à 18:35:32  profilanswer
 

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

n°1649823
gee
Bon ben hon
Posté le 27-11-2007 à 18:57:16  profilanswer
 

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!"
n°1649849
gee
Bon ben hon
Posté le 27-11-2007 à 19:33:59  profilanswer
 

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!"
n°1649879
Joel F
Real men use unique_ptr
Posté le 27-11-2007 à 20:26:12  profilanswer
 

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

n°1649880
gee
Bon ben hon
Posté le 27-11-2007 à 20:28:53  profilanswer
 

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!"
n°1649898
Joel F
Real men use unique_ptr
Posté le 27-11-2007 à 21:10:22  profilanswer
 

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

mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  Besoin d'aide sur un conteneur pour arbre binaire

 

Sujets relatifs
Besoin d'aide pour un truc tout simpledéfinir un polynome à l'aide de la fonction "atoi" avec des listes
Besoins d'aide pour programme lycéeAide pour débutant
Probleme avec File / Buffered Reader aide svp[Débutant][QT4] De l'aide pour un signal/slot
aide pour créer son site internet !valeur d'un noeud spécifique d'un arbre parfait
Besoin d'avis pour organiser ma page 
Plus de sujets relatifs à : Besoin d'aide sur un conteneur pour arbre binaire


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR