#include <iostream>
#include <vector>

class VisualizableVector {
  public:
    class proxy {
      public:
        proxy (std::vector<int> *v) : vect (v) {
        	std::cout << "Before size is: " << vect->size() << std::endl;
        }
        std::vector<int> * operator -> () { return vect; }
        std::vector<int> & operator * () { return *vect; }
        ~proxy () { std::cout << "After size is: " << vect->size() << std::endl; }
      private:
        std::vector <int> * vect;
    };
    
    VisualizableVector (std::vector<int> *v) : vect(v) {}    
    ~VisualizableVector () { delete vect; }
    proxy operator -> () { return proxy (vect); }
    proxy operator * () { return proxy (vect); }
  private:
    std::vector <int> * vect;
};

int main()
{
  VisualizableVector vecc (new std::vector<int>);

  vecc->push_back (10); 	// 1. Note use of -> operator instead of . operator
  vecc->push_back (20); 	// 2. ok
  (*vecc)->push_back (30);	// 3. ok
  //(*vecc).push_back (40);	// 4. error
  (**vecc).push_back (50);	// 5. ok
  //vecc->->push_back (60);	// 6. error
}