#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;
}
I2luY2x1ZGUgPHNldD4KI2luY2x1ZGUgPGlvc3RyZWFtPgpjbGFzcyBGb297CiBwdWJsaWM6CiAgY2xhc3MgSW5uZXJ7CiAgcHVibGljOgogICAgSW5uZXIoRm9vICpmb28pewogICAgICAgIG91dGVyID0gZm9vOwogICAgICAgIGZvby0+YWRkUmVmKHRoaXMpOwogICAgfQogICAgRm9vICpvdXRlcjsKICAgIHZvaWQgb3V0ZXJEZWxldGVkKCl7CiAgICAgICAgb3V0ZXIgPSBudWxscHRyOwogICAgfQogIH07CiAgc3RkOjpzZXQ8SW5uZXIqPiBpbm5lcnM7CiAgdm9pZCBhZGRSZWYoSW5uZXIgKmlubmVyKXsKICAgICAgaW5uZXJzLmluc2VydChpbm5lcik7CiAgfQogIH5Gb28oKXsKICAgICAgZm9yKGF1dG8gaW4gOiBpbm5lcnMpewogICAgICAgIGluLT5vdXRlckRlbGV0ZWQoKTsKICAgICAgfSAgICAgIAogIH0KCgp9OwoKaW50IG1haW4oKXsKICAgIEZvbyAqZiA9IG5ldyBGb28oKTsKICAgIEZvbzo6SW5uZXIgKmkgPSBuZXcgRm9vOjpJbm5lcihmKTsKICAgIHN0ZDo6Y291dCA8PCBmIDw8IHN0ZDo6ZW5kbDsKICAgIHN0ZDo6Y291dCA8PCBpLT5vdXRlciA8PCBzdGQ6OmVuZGw7CiAgICBkZWxldGUgZjsKICAgIHN0ZDo6Y291dCA8PCBpLT5vdXRlciA8PCBzdGQ6OmVuZGw7Cn0=