#include <set>
#include <iostream>
class Foo{
 public:
  class Inner{
  public:
    Inner(Foo *foo){
        outer = foo;
        foo->addRef(this);
    }
    Foo *outer;
    void outerDeleted(){
        outer = nullptr;
    }
  };
  std::set<Inner*> inners;
  void addRef(Inner *inner){
      inners.insert(inner);
  }
  ~Foo(){
      for(auto in : inners){
        in->outerDeleted();
      }      
  }


};

int main(){
    Foo *f = new Foo();
    Foo::Inner *i = new Foo::Inner(f);
    std::cout << f << std::endl;
    std::cout << i->outer << std::endl;
    delete f;
    std::cout << i->outer << std::endl;
}