Salut,
Si le but est uniquement la "sortie" du flux, il y a une possibilité "assez simple" qui peut se mettre en place si tu dispose d'une méthode "level" (ou équivalente) dont le but est de te donner... le niveau d'un élément dans ton arbre...
Ainsi, la méthode level pourrait prendre la forme de
size_t Element::level() const{return mpar? mpar->level()+1 : 0;}
(en considérant que mpar représente un pointeur sur... l'élément parent )
Ton code demandant l'affichage pourrait devenir
1 2 3 4 5 6 7 8 9 10 11 12
| void Element::parcourir(std::ostream &ofs)
{
// provoque l'affichage de l'élément en cours
ofs<<(*this);
// demande de parcourir les éléments "enfants"
Element* temp = mfirstchild;
while(temp)
{
temp->parcourir(ofs)
temp= temp->mnext;//accede à l'élément suivant
}
} |
et la surcharge de l'opérateur << sous une forme proche de
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| friend std::ostream& operator<<(ostream& ofs, Element& elem)
{
static const std::string indent=" ";// ou n'importe quelle quantité
// d'espace (voir, pourquoi pas,
// un "\t")
/* création de l'indentation souhaitée, en rapport avec le niveau
* de l'élément à afficher
*/
for(size_t i=0,i<elem.level();i++)
ofs<<indent;
ofs<<elem.mdata; // ou mdata est l'informaiton à afficher
/* le retour à la ligne, pour préparer la sortie suivante */
ofs<<std::endl;
/* et le renvoi du flux */
return ofs;
} |
Le tout à adapter, bien évidemment, à tes besoins et / ou à tes envies
Il devrait même être possible, sous réserve de transformer parcourir en foncteur et de jouer avec les bind1st et bind2nd, de modifier le code pour utiliser, par exemple, std::copy
Partager