Bonjour,
Merci par avance pour le coup de main !
Je dois serialiser des objets de la classe suivante :
Pour cela je m y prends comme ceci :
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
34
35
36
37 #ifndef POINTS_H #define POINTS_H #include "group.h" #include <QVector> #include <QString> #include <string> #include <iostream> class Points { public: Points(); ~Points(); public: QVector<Group*> groups(void) const { return _groups; } bool addGroup(Group& group); bool addGroup(Group* groupPtr); QVector<QString> groupNames(void) const; void removeGroup(const QString name); int clear(void); void display(std::ostream& stream) const ; private: QVector<Group*> _groups; }; std::ostream& operator <<(std::ostream& stream, Points const& points); QDataStream& operator<<(QDataStream& out, const Points& points); QDataStream& operator>>(QDataStream& in, Points& points); #endif // POINTS_H
Dans le main...
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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78 #include "points.h" Points::Points(void) { } Points::~Points(){ for(int i = 0; i < _groups.size(); i++){ delete _groups[i]; _groups[i] = NULL; } } bool Points::addGroup(Group& group){ // we first check that no group with the same name exists for(int i = 0; i < _groups.size(); i++){ if(!group.name().compare(_groups.at(i)->name())) return false; } _groups.push_back(&group); return true; } bool Points::addGroup(Group* groupPtr){ for(int i = 0; i < _groups.size(); i++){ if(!groupPtr->name().compare(_groups.at(i)->name())) return false; } _groups.push_back(groupPtr); return true; } QVector<QString> Points::groupNames(void) const{ QVector<QString> _names; for(auto it = _groups.cbegin(); it != _groups.cend(); ++it) _names.push_back((*it)->name()); return _names; } int Points::clear(void){ int nGroups(_groups.size()); for(int i = 0; i < nGroups; i++){ delete _groups[i]; _groups[i] = NULL; } _groups.clear(); return nGroups; } void Points::display(std::ostream& stream) const { std::cout << "This list of points contains " << _groups.size() << " groups :" << std::endl; for(int i = 0; i < _groups.size(); i++) stream << "\t" << *_groups[i] << std::endl; } std::ostream& operator <<(std::ostream& stream, Points const& points){ points.display(stream); return stream; } QDataStream& operator<<(QDataStream& out, const Points& points){ out << qint32(points.groups().size()); for(int i = 0; i < points.groups().size(); i++) out << *(points.groups().at(i)); return out; } QDataStream& operator>>(QDataStream& in, Points& points){ qint32 size; in >> size; for(int i = 0; i < size; i++){ Group group; in >> group; points.addGroup(new Group(group)); } return in; }
Ce qui est etonnant c'est que jarrive tres bien a serialiser mes objets "Point" et mes objets Group mais pour les objets Points jobtiens ceci :
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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77 Points points; Point jp("Joans point", 1.2, 2.4); Point map("MAs point", 0.4, 5.7); Point fp("fannys point", 6.0, 7.0); Point np("Joans point", 1.3, 1.4); Point leosp("leosp", 4.5, 2.6); Group group("first group"); group.addPoint(&jp); group.addPoint(&map); group.addPoint(&leosp); group.addPoint(&np); group.addPoint("AnewPoint", 5.2, 4.2); //std::cout << group << std::endl; //to fix //group.removePoint("leosp"); Group sGroup("Second group"); sGroup.addPoint(&fp); sGroup.addPoint("michels point", 8.3, 10.0); points.addGroup(group); points.addGroup(sGroup); Group tGroup(sGroup); tGroup.setName("third group"); Points p2; p2.addGroup(tGroup); p2.addGroup(group); QString filename = "test.txt"; QFile file(filename); if(!file.open(QIODevice::WriteOnly)) { qDebug() << "Could not open " << filename; return 0; } QDataStream out(&file); out.setVersion(QDataStream::Qt_5_1); out << points << p2; //out << group << sGroup << tGroup; //out << jp << map << leosp << fp << np; file.flush(); file.close(); if(!file.open(QIODevice::ReadOnly)) { qDebug() << "Could not open " << filename; return 0; } QDataStream in(&file); in.setVersion(QDataStream::Qt_5_1); Points points1, points2; Point point, point2, point3, point4, point5; Group g1, g2, g3; //in >> g1 >> g2 >> g3; in >> points1 >> points2; //in >> point >> point2 >> point3 >> point4 >> point5; file.close(); //std::cout << g1 << g2 << g3 ;// << p2; std::cout << points1 << points2;
Je devrais avoir des noms de points a la place de "third group" et "Second group" et les coordonnees sont fausses.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 This list of points contains 2 groups : Group's name : first group This group contains the following points : third group (1.25613e-38, 0) Second group (1.25608e-38, 0) (0.4, 5.7)
Quelqu'un aurait-il une idee s'il vous plait...? (je precise que je serialise mon objet de la classe Points de la meme facon que mon objet de la classe Group car ce sont des QVector de pointeurs dans les deux cas mais pour une raison que jignore ca se passe tres bien avec les groupes et pas bien du tout avec les points...)
Merci encore
Partager