Hello à tous,
Alors je m'amuse un programme un ch'tit truc histoire d'apprendre le C++ et à force de complexifier mon programme j'en suis arrivé à un point ou j'aimerais surcharge "cout <<" vers un vector... Ni une ni deux je me lance dans les templates, grâce à ce site et à d'autres (notamment un pour les 0)
Et j'en arrive à ceci :
Et j'en suis très fier car ça fonctionne très bien...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 template <typename A> ostream & operator<<(ostream & o,const vector<A> & truc){ out << " (" << flush; for(size_t chose=0;chose<truc.size()-1;++chose) o << truc[chose] << ", " << flush; o << truc[truc.size()] << " ) " << flush; return o; }
Mais maintenant je continue mon chemin de petit bonhomme et j'arrive dans cette situation je surcharge une autre classe de la sorte :
Avec dans ce cas :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 ostream& operator<<(ostream& o, Collection const& c){ o << "La collection contient les "<< c.tailles.size() << " tailles suivantes :" << endl; o << c.tailles <<endl; o << "Mais aussi les " << c.pieces.size() << " pièces suivantes : " << endl; o << a.pieces<< endl; return o; }Et là, j'ai beau avoir surcharger dans mes classes piece et taille le cout vers des pointeurs de la sorte :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29 #include "./Collect/piece.h" #include "./Collect/taille.h" #include <vector> #include <set> class Collection : public Existante { //Méthodes (publiques): friend ostream& operator<<(ostream&, Collection const&); virtual void existe(); // pas abstraite donc je prototype Existante::existe() ici, afin de la définir dans mon .cc ... Dois-je vraiment le faire ? void addPiece(piece&) ; // pour ajouter une pièce à ma collection hétérogène void addTaille(taille&) ; // de même pour une taille void delallP(); //methode supprimant toutes les pièces de mon vector de piece void delallT(); // idem pour les taille dans tailles protected: vector<taille*> tailles; vector<piece*> pieces; set<piece*> ListP; // j'envisage d'éventuellement utilisé set à la place de vector, vu que j'ai affaire à des pointeurs... set<taille*> ListT; //idem void chaine() const; //Il faut savoir que chaque piece contient un pointeur vers la prochaine pièce... cette methode est censée faire pointer ces pointeurs vers la prochaine pièce dans mon vector de piece... };
Code : Sélectionner tout - Visualiser dans une fenêtre à part friend ostream& operator<<(ostream&, piece* const&);Bin vous vous en doutez, j'ai droit à un joli "Segmentation fault" suivant ce que j'essaye, mais rarement encore, ou alors plus généralement :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 ostream& operator<<(ostream& out, piece* const& d){ out << "Pièce en question : "<< endl; out << tab << "année : " << d->an << endl; out << tab << "créateur : " << d->cr << endl; out << tab << "interet : " << d->in << endl; return out; }
Alors pour info, je ne comprends pas la présence du 0 à la fin... j'ai en réalité 3 tailles et 2 pièces... Mais visiblement il ne les liste pas tous...La collection contient les 3 tailles suivantes :
( 0xbfcf8200, 0xbfcf826c, 0 )
Mais aussi les 2 pièces suivantes :
( 0xbfcf80bc, 0 )
Et là, bah j'aimerais bien réussir à surpasser cela sans devoir modifier ma surcharge de vector de la sorte :
Car à ce moment ça fonctionne, certes, mais bon après c'est partout ailleurs lorsque j'utilise par exemple des "vector<int>" que ça fonctionne plus...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 template <typename A> ostream & operator<<(ostream & o,const vector<A> & truc){ out << " (" << flush; for(size_t chose=0;chose<truc.size()-1;++chose) o << (*truc[chose]) << ", " << flush; o << (*truc[truc.size()]) << " ) " << flush; return o; }
Alors ??
Ce serait vraiment cool si vous aviez une réponse rapide
J'ai aussi des soucis avec ma fonction "void chaine() const"... elle est censée me connecter toutes mes pièces entre elle...
Bah elle aime pas iterator :
Mais ça c'est un détail : avec un int i, sans utiliser d'itérateur, ça joue donc à la limite
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 void Collection::chaine() const{ // ATTENTION, algorythme non optimal, à optimiser ;) for(vector<piece*>::iterator i = pieces.begin(); i != piece.end; ++i) { int j(0); do{j++; } while ((*i)->isnext(pieces[j])); // la fonction isnext est une fonction que les piece ont, qui retourne un bool... et qui set le pointeur vers la suivante de la piece en question vers la piece suivante. }
(Mais seulement pour vector<piece*> pas pour set<piece*>, c'est pour ça que j'aurais voulu utiliser un itérateur, plus simple de switcher entre vector et set... si je me décide pour l'un ou l'autre...)
EDIT : j'ai un autre gros bug :
Mes pièces sont en réalité fractionnée en sous-classe...
Et mnt j'ai droit à un segmentation fault à chaque fois suite à la modification de mon code de test : j'ai fait un cout directement vers une pièce sans passer par le vector<piece*>, juste pour voir et avec ce cout il bug complétement... Alors que j'ai bien surcharger mon cout << pour la pièce en question... des idées ? je n'ai rien touché au niveau des pointeurs...
voici mon code de test :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33 Collection test; test.delallT(); test.delallP(); Untruc f_d(0,8,5); Untruc e_d(2,0,0); Untruc s_d(0,10,0); Untruc e_s(-11,-41,0); Untruc q_s(-18,-21,0); Courbe d(f_d, e_d, s_d, 0.2, 3); // piece courbe... Droite r(s_d, s_d, 0.1); // piece droite... aimant q(e_s, q_s, 1, 12); // pièce aimantée Untruc p1(84, -37, 0); Untruc v1(-20, -28,0); Untruc p2(90, -17, 0 ); Untruc v2(200, -254,0); Untruc f(0,0,0); taille t1(p1,v1,272, 653, 2, f); taille t2(p2,v2,0.938272, 765, 2, f); test.addPiece(d); test.addPiece(r); test.addPiece(q); test.addTaille (part1); test.addTaille (part2); cout << test << endl; cout << d << r << q << endl; // Et c'est depuis que j'ai ajouté cette ligne que j'ai le segmentation fault à chaque fois...
Partager