fork download
  1. #include <iostream>
  2. #include <vector>
  3.  
  4. class VisualizableVector {
  5. public:
  6. class proxy {
  7. public:
  8. proxy (std::vector<int> *v) : vect (v) {
  9. std::cout << "Before size is: " << vect->size() << std::endl;
  10. }
  11. std::vector<int> * operator -> () { return vect; }
  12. std::vector<int> & operator * () { return *vect; }
  13. ~proxy () { std::cout << "After size is: " << vect->size() << std::endl; }
  14. private:
  15. std::vector <int> * vect;
  16. };
  17. VisualizableVector (std::vector<int> *v) : vect(v) {}
  18. ~VisualizableVector () { delete vect; }
  19. proxy operator -> () { return proxy (vect); }
  20. proxy operator * () { return proxy (vect); }
  21. private:
  22. std::vector <int> * vect;
  23. };
  24.  
  25. int main()
  26. {
  27. VisualizableVector vecc (new std::vector<int>);
  28.  
  29. vecc->push_back(30); // ok // one ->
  30. //vecc.operator->().push_back(30);// error // one ->
  31.  
  32. //vecc->->push_back(30); // error // two ->
  33. vecc.operator->()->push_back(30); // ok // two ->
  34.  
  35. auto proxy3 = vecc.operator->(); // 1st operator->()
  36. auto pointer = proxy3.operator->(); // 2nd operator->()
  37. pointer->push_back(30); // 3rd operator->()
  38.  
  39. return 0;
  40. }
Success #stdin #stdout 0s 3416KB
stdin
Standard input is empty
stdout
Before size is: 0
After size is: 1
Before size is: 1
After size is: 2
Before size is: 2
After size is: 3