Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

pb d ajout

2 réponses
Avatar
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 ;)

2 réponses

Avatar
Franck Branjonneau
eric écrivait:

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

Avatar
eric
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 ;)