Bonjour,
Je suis actuellement en train de développer une classe qui analyse un flux entrant et compte le nombre d'occurrences pour chaque caractère, en stockant le résultat dans un std::map. Jusque là tout va bien, mais à la fin du programme je dois afficher le pourcentage d'occurrence pour chaque lettre, donc il me faut le nombre total de lettres qui ont été analysées, j'ai donc opté pour un foncteur :
Si j'affiche m_total depuis l'intérieur de la classe, tout fonctionne comme prévue, mais dès que je l'affiche depuis l'extérieur de la classe avec la méthode accesseur il m'affiche la valeur avec laquelle a été initialisée m_total :
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 template<class T1, class T2> class TotalPair { T2 m_total; public: void operator()(std::pair<T1, T2> const &x) { // Add number of occurrences m_total += x.second; } T2 total() const { // Return total number of occurrences return m_total; } TotalPair() : m_total(0) { } };
Bref je ne vois vraiment pas d'où peut bien venir le problème, j'ai cherché pendant des heures, j'ai même essayé des exemples de code tout faits et censés fonctionner mais j'ai le même problème partout.
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 ostream &operator<<(ostream &out, FrequencyAnalysis const &freqAnalysis) { // Check output stream if (not out) throw runtime_error("operator<<: bad out"); // Get the total number of occurrences statsMap stats(freqAnalysis.stats()); TotalPair<char, int> total; for_each(stats.begin(), stats.end(), total); cout << total.total() << endl; // FIXME: AFFICHE 0 // Print number of occurrences for each character PrintPair<char, int> print(out); for_each(stats.begin(), stats.end(), print); // Return output stream return out; }
Merci par avance de votre aide,
Fr3ak.
Edit : mea culpa, je n'avais pas assez cherché, il fallait récupérer le retour de la fonction std::for_each.
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 ostream &operator<<(ostream &out, FrequencyAnalysis const &freqAnalysis) { // Check output stream if (not out) throw runtime_error("operator<<: bad out"); // Get the total number of occurrences statsMap stats(freqAnalysis.stats()); TotalPair<char, int> total; total = for_each(stats.begin(), stats.end(), total); cout << total.total() << endl; // OK // Print number of occurrences for each character PrintPair<char, int> print(out); for_each(stats.begin(), stats.end(), print); // Return output stream return out; }
Partager