fork download
  1. #include <iostream>
  2.  
  3. class Coord
  4. {
  5. private:
  6. double x, y, z;
  7.  
  8. public:
  9. Coord();
  10. Coord(double, double, double);
  11.  
  12. class setters {
  13. friend class Coord;
  14.  
  15. private:
  16. explicit setters(Coord &);
  17.  
  18. public:
  19. setters(setters const &) = delete;
  20. setters & operator=(setters const &) = delete;
  21.  
  22. void x(double) const;
  23. void y(double) const;
  24. void z(double) const;
  25.  
  26. private:
  27. Coord & coord;
  28. };
  29. friend class setters;
  30.  
  31. class getters {
  32. friend class Coord;
  33.  
  34. private:
  35. explicit getters(Coord const &);
  36.  
  37. public:
  38. getters(getters const &) = delete;
  39. getters & operator=(getters const &) = delete;
  40.  
  41. double x() const;
  42. double y() const;
  43. double z() const;
  44.  
  45. private:
  46. Coord const & coord;
  47. };
  48. friend class getters;
  49.  
  50. setters const set;
  51. getters const get;
  52. };
  53.  
  54. Coord::Coord() : x(0), y(0), z(0), set(*this), get(*this) { }
  55.  
  56. Coord::Coord(double px, double py, double pz) : x(px), y(py), z(pz), set(*this), get(*this) { }
  57.  
  58. Coord::setters::setters(Coord & c) : coord(c) { }
  59.  
  60. void Coord::setters::x(double px) const {
  61. coord.x = px;
  62. }
  63.  
  64. void Coord::setters::y(double py) const {
  65. coord.y = py;
  66. }
  67.  
  68. void Coord::setters::z(double pz) const {
  69. coord.z = pz;
  70. }
  71.  
  72. Coord::getters::getters(Coord const & c) : coord(c) { }
  73.  
  74. double Coord::getters::x() const {
  75. return coord.x;
  76. }
  77.  
  78. double Coord::getters::y() const {
  79. return coord.y;
  80. }
  81.  
  82. double Coord::getters::z() const {
  83. return coord.z;
  84. }
  85.  
  86. int main() {
  87. Coord a(1,2,3);
  88.  
  89. std::cout << a.get.x() << ' ' << a.get.y() << ' ' << a.get.z() << std::endl;
  90.  
  91. a.set.x(5);
  92. a.set.y(6);
  93. a.set.z(7);
  94.  
  95. std::cout << a.get.x() << ' ' << a.get.y() << ' ' << a.get.z() << std::endl;
  96.  
  97. return 0;
  98. }
Success #stdin #stdout 0s 3340KB
stdin
Standard input is empty
stdout
1 2 3
5 6 7