pb d ajout

Le
eric
bon, c'est fou comme le c++ peut s'oublier a une vitesse :)

encore une blague de débutant mais ou

j ai une classe noeud du style :

class Noeud {
private:

vector<Noeud> fils_;
public:

vector<Noeud> getFils() { return fils_; }
void ajouteFils(Noeud unFils) { fils_.push_back(unFils); }
};

pur un test je fais :

// creation racine arbre
Noeud racine("RACINE");
// ajout premier niveau
racine.ajouteFils(Noeud("1G")); // fils 0
racine.ajouteFils(Noeud("1D")); // fils 1
// ajout deuxieme niveau
racine.getFils()[0].ajouteFils(Noeud("1G2G")); // fils 0 fils 0
racine.getFils()[0].ajouteFils(Noeud("1G2D")); // fils 0 fils 1
racine.getFils()[1].ajouteFils(Noeud("1D2D")); // fils 1 fils 1

cout << racine.getFils().size() << endl; // ok, renvoie 2
cout << racine.getFils()[0].getFils().size() << endl; // renvoie 0!!

err ou j ai encore fait ma betise moi ?

bonne récupération de fête a tous en attendant la fête suivante ;)
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Franck Branjonneau
Le #313524
eric
j ai une classe noeud du style :

class Noeud {
private:
...
vector<Noeud> fils_;
public:
...
vector<Noeud> getFils() { return fils_; }


Ici, ta fonction retourne une *copie* de fils_.

void ajouteFils(Noeud unFils) { fils_.push_back(unFils); }
};

pur un test je fais :

// creation racine arbre
Noeud racine("RACINE");
// ajout premier niveau
racine.ajouteFils(Noeud("1G")); // fils 0
racine.ajouteFils(Noeud("1D")); // fils 1 ...
// ajout deuxieme niveau
racine.getFils()[0].ajouteFils(Noeud("1G2G")); // fils 0 fils 0


Et là le Noeud("1G2G") est ajouté à la dite copie qui est immédiatement
détruite.

racine.getFils()[0].ajouteFils(Noeud("1G2D")); // fils 0 fils 1


Bis.

racine.getFils()[1].ajouteFils(Noeud("1D2D")); // fils 1 fils 1


Ter.

cout << racine.getFils().size() << endl; // ok, renvoie 2
cout << racine.getFils()[0].getFils().size() << endl; // renvoie 0!!


Cohérent !

err ou j ai encore fait ma betise moi ?


Je te suggères :

vector<Noeud> & getFils() { return fils_; }

et

vector<Noeud> const & getFils() const { return fils_; }

Personnellement j'ajouterai aussi :

vector<Noeud> & getFils(int const n) { return fils_[n]; }
vector<Noeud> const & getFils(int const n) const { return fils_[n]; }

(avec le assert qui va bien).
--
Franck Branjonneau

eric
Le #313523
bonjour

merci de ta réponse !

vector<Noeud> getFils() { return fils_; }


Ici, ta fonction retourne une *copie* de fils_.


ouinnnn hum oki vue la gaffe je sors et j'arrete les fetes ;)

Et là le Noeud("1G2G") est ajouté à la dite copie qui est immédiatement
détruite.


lol oui forcément ...
pfff suis parti d'un code ou j'avais tout mis en pointeur, et j'ai
adapté sans les pointeurs en tombant dans le panneau :(

cout << racine.getFils().size() << endl; // ok, renvoie 2
cout << racine.getFils()[0].getFils().size() << endl; // renvoie 0!!


Cohérent !


un peu trop a mon gout lol

Je te suggères :

vector<Noeud> & getFils() { return fils_; }


logique


et

vector<Noeud> const & getFils() const { return fils_; }


ah oui
je met pas en général car je ne prévois pas ce cas ...


Personnellement j'ajouterai aussi :

vector<Noeud> & getFils(int const n) { return fils_[n]; }
vector<Noeud> const & getFils(int const n) const { return fils_[n]; }

(avec le assert qui va bien).


oui aussi.... avec les & qui vont biens

bon merci encore et bonnes fetes mais pas trop sinon vous finirez par
tomber dans tous les pieges ;)


Publicité
Poster une réponse
Anonyme