Bonjour,

Je tente actuellement de faire une liste triée d'objet de type Vertex*.
Je vous met les fichiers vertex.hpp et vertex.cpp

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
 
#ifndef VERTEX_HPP
#define VERTEX_HPP
 
class Vertex {
 
public:
  // Constructeur
  Vertex (float x, float y, float z);
 
  // Accesseur en lecture seulement
  const float &x () const;
  const float &y () const;
  const float &z () const;
 
private:
  float _x, _y, _z;
 
};
 
// Opérateur de comparaison
bool operator== (const Vertex &v1, const Vertex &v2);
bool operator!= (const Vertex &v1, const Vertex &v2);
bool operator>  (const Vertex &v1, const Vertex &v2);
bool operator<= (const Vertex &v1, const Vertex &v2);
bool operator<  (const Vertex &v1, const Vertex &v2);
bool operator>= (const Vertex &v1, const Vertex &v2);
 
#endif /* VERTEX_HPP */
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
79
80
81
82
83
84
85
86
87
88
89
90
91
 
#include "vertex.hpp"
 
/*
  Constructeur :
*/
 
Vertex::Vertex (float x, float y, float z) {
  _x = x;
  _y = y;
  _z = z;
}
 
/*
  Accesseur :
  en lecture seulement
*/
 
const float &Vertex::x () const {
  return _x;
}
 
const float &Vertex::y () const {
  return _y;
}
 
const float &Vertex::z () const {
  return _z;
}
 
/*
  Opérateur :
*/
 
bool operator== (const Vertex &v1, const Vertex &v2) {
  return ((v1.x() == v2.x()) &&
	  (v1.y() == v2.y()) &&
	  (v1.z() == v2.z()));
}
 
bool operator!= (const Vertex &v1, const Vertex &v2) {
  return (!(v1 == v2));
}
 
bool operator>  (const Vertex &v1, const Vertex &v2) {
 
  if (v1.x() > v2.x())
    return true;
  else if (v1.x() < v2.x())
    return false;
 
  if (v1.y() > v2.y())
    return true;
  else if (v1.y() < v2.y())
    return false;
 
  if (v1.z() > v2.z())
    return true;
  else if (v1.z() < v2.z())
    return false;
 
  return false;
}
 
bool operator<= (const Vertex &v1, const Vertex &v2) {
  return (!(v1 > v2));
}
 
bool operator<  (const Vertex &v1, const Vertex &v2) {
 
  if (v2.x() > v1.x())
    return true;
  else if (v2.x() < v1.x())
    return false;
 
  if (v2.y() > v1.y())
    return true;
  else if (v2.y() < v1.y())
    return false;
 
  if (v2.z() > v1.z())
    return true;
  else if (v2.z() < v1.z())
    return false;
 
  return false;
}
 
bool operator>= (const Vertex &v1, const Vertex &v2) {
  return (!(v1 < v2));
}
Pour faire une liste triée j'ai donc besoin de pouvoir comparer mes vertex : c'est pour cela que j'ai surchargé les opérateurs de comparaison.

Pour faire ma liste triée de vertex je me suis orienté vers la classe QSet pensant que son utilisation serait simple sauf que lorsque je crée plusieurs objet Vertex

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
 
Vertex *v1 = new Vertex (...);
Vertex *v2 = new Vertex (...);
Vertex *v3 = new Vertex (...);
Vertex *v4 = new Vertex (...);
et que en suite je les rajoute dans mon QSet

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
 
QSet <Vertex *> _vertex;
_vertex.insert(v1);
_vertex.insert(v2);
_vertex.insert(v3);
_vertex.insert(v4);
alors les éléments ne sont pas triés comme je le voudrais.

J'ai également remarqué que pour utiliser mes opérateur de comparaison je devais
utilisé (*var) : Ainsi

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
 
if (v1 == v2) // Erroné
if ((*v1) == (*v2)) // Bon
Comment je dois donc faire pour avoir un QSet trié ou pour que mes opérateur de comparaison surchargé n'envoie pas une réponse érroné pour (a == b).

Merci d'avance.