home *** CD-ROM | disk | FTP | other *** search
/ Chip 2001 October / Chip_2001-10_cd1.bin / chplus / cpp / friend4.cpp < prev    next >
C/C++ Source or Header  |  2001-08-02  |  3KB  |  93 lines

  1. ////////////////////////////////////////////////////////////////////////////
  2. //
  3. //  soubor: friend4.cpp
  4. //  autor: Jaroslav Franek
  5. //  copyright? proc ne: (c) 2001 Jaroslav Franek
  6. //
  7. //  Spratelene funkce, dil 3
  8. //
  9. ////////////////////////////////////////////////////////////////////////////
  10. //---------------------------------------------------------------------------
  11.  
  12. #pragma hdrstop
  13. #include <iostream>
  14.  
  15. //---------------------------------------------------------------------------
  16.  
  17. template <class T> class Trida;
  18.  
  19. template <class T> void f(Trida<T> &);  // (1)
  20. void f(Trida<int> &);  // (2)
  21. template <class T> void g(Trida<T> &);  // (3)
  22.  
  23. ////////////////////////////////////////////////////////////////////////////
  24. //
  25. //  class Trida<T>
  26. //
  27. ////////////////////////////////////////////////////////////////////////////
  28.  
  29. template <class T> class Trida
  30. {
  31.    // sp°ßtelene funkce f
  32.    friend void f(Trida<T> &);  // (g)
  33.  
  34.    // sp°ßtelene funkce g
  35.    friend void g(Trida<T> &);  // (k)
  36.  
  37.    // data nepristupna zvenku (private)
  38.    static const int priv_data = 2603194; // "2603194, jste propusten..." :-)
  39. };
  40.  
  41. ////////////////////////////////////////////////////////////////////////////
  42. //
  43. //  definice funkci
  44. //
  45. ////////////////////////////////////////////////////////////////////////////
  46.  
  47. // ted to neni pritel
  48. template <class T> void f(Trida<T> & x)  // (1)
  49. {
  50.    std::cout << "\nja jsem sablonova f<" << typeid(T).name() << ">"
  51.                 " a magicke cislo neznam";
  52. }
  53.  
  54. // tohle je pritel
  55. void f(Trida<int> & x)  // (2)
  56. {
  57.    std::cout << "\nja jsem nesablonova f"
  58.                 " a magicke cislo je " << x.priv_data;
  59. }
  60.  
  61. // a tohle neni pritel
  62. template <class T> void g(Trida<T> & x)  // (3)
  63. {
  64.    std::cout << "\nja jsem sablonova g<" << typeid(T).name() << ">"
  65.                 " a magicke cislo neznam";
  66. }
  67.  
  68. ////////////////////////////////////////////////////////////////////////////
  69. //
  70. //  v praxi :
  71. //
  72. ////////////////////////////////////////////////////////////////////////////
  73.  
  74. #pragma argsused
  75. int main(int argc, char* argv[])
  76. {
  77.    Trida<int> a_int;
  78.    Trida<double> a_double;
  79.  
  80.    f<int>(a_int);  // musime rict, ze chceme volat specializaci
  81.                    // tohle projde, ale f<int> neni pritel
  82.  
  83.    f(a_int);       // radova funkce, je pritel, OK
  84. //   f(a_double);    // tohle neprojde, neni k dispozici radova funkce
  85.  
  86. //   g(a_int);       // tohle neprojde, protoze to neni radova funkce
  87. //   g(a_double);    // to same
  88.  
  89.    return 0;
  90. }
  91. //---------------------------------------------------------------------------
  92.  
  93.