home *** CD-ROM | disk | FTP | other *** search
/ Chip 2002 February / Chip_2002-02_cd1.bin / chplus / funktor / f22_podraz_citac.cpp < prev    next >
C/C++ Source or Header  |  2002-01-02  |  3KB  |  113 lines

  1. //---------------------------------------------------------------------------
  2.  
  3. #include <iostream>
  4. #include <vector>
  5. #include <algorithm>
  6.  
  7. //---------------------------------------------------------------------------
  8. //  soubor:    f22_podraz_citac.cpp
  9. //  autor:     Jaroslav Franek
  10. //  vytvoreno: 20011125
  11. //  copyright: (c) 2001 Jaroslav Franek
  12. //  umisteni:  Chip CD, rubrika Chip Plus, 02/02
  13. //  reference: Jak se na funktor vola... II. dil, Chip 02/02
  14. //  testovano v : Borland C++ Builder 5.0
  15. //
  16. //  komentar:  podraz - citac (viz clanek)
  17. //---------------------------------------------------------------------------
  18.  
  19. //---------------------------------------------------------------------------
  20. //
  21. //  funktor - citac,
  22. //  verze ktera nefunguje spravne
  23. //
  24. //---------------------------------------------------------------------------
  25.  
  26. class cFunktor
  27. {
  28. public:
  29.    cFunktor()
  30.       : pocet_(0)
  31.       {
  32.       }
  33.    int operator ()(int x)
  34.    {
  35.       ++pocet_;
  36.       // n∞jakΘ akce ...
  37.       return x;
  38.    }
  39.    int get_pocet() { return pocet_; }
  40.    void reset_pocet() { pocet_ = 0; }
  41. private:
  42.    int pocet_;
  43.    // ...
  44. };
  45.  
  46. //---------------------------------------------------------------------------
  47. //
  48. //  funktor - citac, tentokrat fungujici,
  49. //  pozor: reference odkazuje nekam ven z funktoru, takze vsechny kopie
  50. //         budou odkazovat na to same misto
  51. //
  52. //---------------------------------------------------------------------------
  53.  
  54. class cFunktorX
  55. {
  56. public:
  57.    cFunktorX(int & counter)
  58.       : pocet_(counter)
  59.       {
  60.          reset_pocet();
  61.       }
  62.    int operator ()(int x)
  63.    {
  64.       ++pocet_;
  65.       // n∞jakΘ akce ...
  66.       return x;
  67.    }
  68.    int get_pocet() { return pocet_; }
  69.    void reset_pocet() { pocet_ = 0; }
  70. private:
  71.    int & pocet_;
  72.    // ...
  73. };
  74.  
  75. //---------------------------------------------------------------------------
  76. //
  77. //  kde je chyba?
  78. //
  79. //---------------------------------------------------------------------------
  80.  
  81. int main()
  82. {
  83.    // nejdrive si pripravime pole
  84.    const int N = 9;
  85.    int pole[] = { -1, -2, 3, -4, 0, -6, 0, -8, 9 };
  86.  
  87.    // a ted STL kontejner
  88.    std::vector<int> cisla(pole, pole + N);   // N prvku, pole[i]
  89.  
  90.    // ted nam nejde o to, jake tam jsou prvky, nebo, co se s nimi stane
  91.    // jde jen o to, kolikrat se zavola funktor
  92.    // mel by se zavolat N-krat
  93.  
  94.    // podraz
  95.    cFunktor funktor;
  96.    funktor.reset_pocet();
  97.    std::transform(cisla.begin(), cisla.end(), cisla.begin(), funktor);
  98.    std::cout << "pocet volani = " << funktor.get_pocet() << std::endl;
  99.    // vzdycky vypise 0
  100.  
  101.  
  102.    // tohle udela, co chceme
  103.    int pocet;
  104.    cFunktorX funktorx(pocet);
  105.    funktorx.reset_pocet();  // tj. pocet = 0;
  106.    std::transform(cisla.begin(), cisla.end(), cisla.begin(), funktorx);
  107.    std::cout << "pocet volani = " << funktorx.get_pocet() << std::endl;
  108.    // tohle vypise N
  109.  
  110.    return 0;
  111. }
  112. //---------------------------------------------------------------------------
  113.