Bonjour,
J'étais en train d'étudier le mécanisme qui permet de réaliser l'opération suivante avec un flot tel que, par exemple, cin:
Le fonctionnement du morceau de code ci-dessus passe par la surchage de l'opérateur de cast (void*). Je me suis donc construit un petit exemple afin d'étudier ce mécanisme. Il s'agit d'une classe qui représente un index de boucle. Voici le code:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 using namespace std; // ... char c; // ... // Recopie le flot cin sur le flot cout while ( cin.get(c) ){ cout.put(c); }
Tout fonctionne parfaitement, mais je voudrais savoir à quel niveau intervient le cast (void *) dans la construction:
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 #include <iostream> /* * Représente un index de boucle. * * Aucun autre intérêt que celui d'étudier la surchage de l'opérateur * (void*) comme c'est le cas pour les flots d'entrée/sortie */ class IndexBoucle { int i; // Valeur de l'entier int max; // i doit rester inférieur à max public: // Constructeur de la classe IndexBoucle(int limite) { if ( i<limite ) { i = 0; max = limite; } } // Accesseur permettant d'obtenir i int getIndex() { return i; } // Surcharge de l'opérateur de cast (void*) operator void*() { return (++i<max) ? this : NULL; } }; int main() { IndexBoucle i(10); /* La valeur de l'index est incémentée au sein de * IndexBoucle::operator void*() qui renvoit NULL * lorsque l'index vaut 10. */ while (i) { std::cout << "Iteration " << i.getIndex() << std::endl; } return 0; }
Y a-t'il conversion implicite de i (ici un objet de type IndexBoucle, mais cela peut également être un flot dont on désire tester le status d'erreur) en un pointeur générique? Est-ce un point définit par la norme ou est-ce que cela dépend de l'implémentation?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 while (i){ // ... }
Merci d'avance pour avis
Meilleures salutations
Thierry
Partager