Guest User

Untitled

a guest
Jun 22nd, 2018
84
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.00 KB | None | 0 0
  1. class Restricted ()
  2. {
  3.  
  4. public int Property1{get; }
  5. public int Property2{get; }
  6.  
  7. }
  8.  
  9. public int Property1{ get; private set;}
  10.  
  11. public interface IPublicProperties
  12. {
  13. int Property1 { get; }
  14. int Property2 { get; }
  15. }
  16.  
  17. internal class Restricted : IPublicProperties
  18. {
  19. public int Property1 { get; set; }
  20. public int Property2 { get; set; }
  21. }
  22.  
  23. #include <iostream>
  24.  
  25. struct unlocked {
  26. int a;
  27. int b;
  28. //virtual ~unlocked(); // don't call delete on a unlocked
  29. };
  30.  
  31. class locked : private unlocked {
  32.  
  33. public:
  34. locked() {
  35. a = 0 ; // accessible within locked
  36. b = 1 ;
  37. }
  38.  
  39. unlocked& unlock( ) {
  40. return *this ;
  41. }
  42.  
  43. void print( std::ostream& o ) {
  44. o << " a = " << a << ", b = " << b << std::endl ;
  45. }
  46.  
  47. } ;
  48.  
  49. int main() {
  50.  
  51. locked foo ;
  52. foo.print( std::cout );
  53. // foo.a = 1 ; illegal
  54. foo.unlock().a = 1 ;
  55. foo.print( std::cout ) ;
  56. std::cout << &foo << " " << &(foo.unlock()) << std::endl;
  57. }
  58.  
  59. #include <iostream>
  60.  
  61. class locked ;
  62.  
  63. class keyed ;
  64.  
  65. class keyed {
  66. protected:
  67. struct key{};
  68.  
  69. public:
  70. void mutateLocked( locked& );
  71. };
  72.  
  73.  
  74. struct unlocked {
  75. int a;
  76. int b;
  77. void print( std::ostream& o ) {
  78. o << this << " a = " << a << ", b = " << b << std::endl ;
  79. }
  80. };
  81.  
  82. class locked : private unlocked, private keyed {
  83.  
  84. public:
  85. locked() {
  86. a = 0 ;
  87. b = 1 ;
  88. }
  89.  
  90. unlocked& unlock( keyed::key& k) {
  91. return *this ;
  92. }
  93.  
  94. using unlocked::print;
  95. } ;
  96.  
  97. void keyed::mutateLocked(locked& m ) {
  98. key k ;
  99. m.print(std::cout) ;
  100. unlocked& n = m.unlock( k ) ;
  101. n.a = 55;
  102. n.b = 77;
  103. n.print(std::cout);
  104. }
  105.  
  106. int main() {
  107.  
  108. keyed k ;
  109. //keyed::key kk; // not accessible
  110.  
  111. locked foo ;
  112. //unlocked& bar = (unlocked) foo; // not accessible
  113. foo.print( std::cout );
  114. //foo.a = 1 ; // not accessible
  115. //foo.unlock(kk).a = 1 ;
  116. k.mutateLocked(foo);
  117. foo.print( std::cout ) ;
  118. }
Add Comment
Please, Sign In to add comment