#ifdef _WIN32
#include <windows.h>
#pragma warning(disable:4355)
#endif//_WIN32
#include <string>
#include <iostream>
struct Base;
struct Widget;
struct VCons
{
VCons() : caller(this), base(NULL), param(NULL)
{}
VCons(const VCons& vc) : caller(&vc), base(NULL), param(NULL)
{}
~VCons();
void Set(Base* c, Widget* p) const
{
base = c;
param = p;
}
private:
const VCons* caller;
mutable Base* base;
mutable Widget* param;
};
struct Base
{
Base(Widget* p, VCons vc)
{
vc.Set(this, p);
}
virtual void OnCreate(Widget* p)=0;
};
struct Widget : public Base
{
Widget* parent;
Widget(Widget* p, VCons vc=VCons()) : Base(p, vc), parent(NULL)
{}
void OnCreate(Widget* p)
{
parent = p;
}
};
struct Button : public Widget
{
Button(Widget* p, VCons vc=VCons()) : Widget(p, vc)
{}
void OnCreate(Widget* p)
{
Widget::OnCreate(p);
std::cout<<"Button"<<std::endl;
}
};
struct RadioButton : public Button
{
RadioButton(Widget* p, VCons vc=VCons()) : Button(p, vc)
{}
void OnCreate(Widget* p)
{
Widget::OnCreate(p);
std::cout<<"RadioButton"<<std::endl;
}
};
struct MainFrame : public Widget
{
Button button;
RadioButton radio;
MainFrame(VCons vc=VCons()) : Widget(NULL, vc), button(this), radio(this)
{}
void OnCreate(Widget* p)
{
Widget::OnCreate(NULL);
std::cout<<"MainFrame"<<std::endl;
}
};
VCons::~VCons()
{
if(caller == this)
base->OnCreate(param);
else
caller->Set(base, param);
}
int main()
{
MainFrame frame;
int i=0;
std::cin>>i;
return 0;
}
I2lmZGVmIF9XSU4zMgojaW5jbHVkZSA8d2luZG93cy5oPgojcHJhZ21hIHdhcm5pbmcoZGlzYWJsZTo0MzU1KQojZW5kaWYvL19XSU4zMgoKI2luY2x1ZGUgPHN0cmluZz4KI2luY2x1ZGUgPGlvc3RyZWFtPgoKCnN0cnVjdCBCYXNlOwpzdHJ1Y3QgV2lkZ2V0OwoKc3RydWN0IFZDb25zCnsKCVZDb25zKCkgOiBjYWxsZXIodGhpcyksIGJhc2UoTlVMTCksIHBhcmFtKE5VTEwpCgl7fQoKCVZDb25zKGNvbnN0IFZDb25zJiB2YykgOiBjYWxsZXIoJnZjKSwgYmFzZShOVUxMKSwgcGFyYW0oTlVMTCkKCXt9CgoJflZDb25zKCk7CgoJdm9pZCBTZXQoQmFzZSogYywgV2lkZ2V0KiBwKSBjb25zdAoJewoJCWJhc2UgPSBjOwoJCXBhcmFtID0gcDsKCX0KCnByaXZhdGU6CgoJY29uc3QgVkNvbnMqIGNhbGxlcjsKCW11dGFibGUgQmFzZSogYmFzZTsKCW11dGFibGUgV2lkZ2V0KiBwYXJhbTsKCn07CgoKc3RydWN0IEJhc2UKewoJQmFzZShXaWRnZXQqIHAsIFZDb25zIHZjKQoJewoJCXZjLlNldCh0aGlzLCBwKTsKCX0KCgl2aXJ0dWFsIHZvaWQgT25DcmVhdGUoV2lkZ2V0KiBwKT0wOwp9OwoKc3RydWN0IFdpZGdldCA6IHB1YmxpYyBCYXNlCnsKCVdpZGdldCogcGFyZW50OwoKCVdpZGdldChXaWRnZXQqIHAsIFZDb25zIHZjPVZDb25zKCkpIDogQmFzZShwLCB2YyksIHBhcmVudChOVUxMKQoJe30KCgl2b2lkIE9uQ3JlYXRlKFdpZGdldCogcCkKCXsKCQlwYXJlbnQgPSBwOwoJfQp9OwoKc3RydWN0IEJ1dHRvbiA6IHB1YmxpYyBXaWRnZXQKewoJQnV0dG9uKFdpZGdldCogcCwgVkNvbnMgdmM9VkNvbnMoKSkgOiBXaWRnZXQocCwgdmMpCgl7fQoKCXZvaWQgT25DcmVhdGUoV2lkZ2V0KiBwKQoJewoJCVdpZGdldDo6T25DcmVhdGUocCk7CgkJc3RkOjpjb3V0PDwiQnV0dG9uIjw8c3RkOjplbmRsOwoJfQp9OwoKc3RydWN0IFJhZGlvQnV0dG9uIDogcHVibGljIEJ1dHRvbgp7CglSYWRpb0J1dHRvbihXaWRnZXQqIHAsIFZDb25zIHZjPVZDb25zKCkpIDogQnV0dG9uKHAsIHZjKQoJe30KCgl2b2lkIE9uQ3JlYXRlKFdpZGdldCogcCkKCXsKCQlXaWRnZXQ6Ok9uQ3JlYXRlKHApOwoJCXN0ZDo6Y291dDw8IlJhZGlvQnV0dG9uIjw8c3RkOjplbmRsOwoJfQp9OwoKc3RydWN0IE1haW5GcmFtZSA6IHB1YmxpYyBXaWRnZXQKewoJQnV0dG9uIGJ1dHRvbjsKCVJhZGlvQnV0dG9uIHJhZGlvOwoKCU1haW5GcmFtZShWQ29ucyB2Yz1WQ29ucygpKSA6IFdpZGdldChOVUxMLCB2YyksIGJ1dHRvbih0aGlzKSwgcmFkaW8odGhpcykKCXt9CgoJdm9pZCBPbkNyZWF0ZShXaWRnZXQqIHApCgl7CQkKCQlXaWRnZXQ6Ok9uQ3JlYXRlKE5VTEwpOwoJCXN0ZDo6Y291dDw8Ik1haW5GcmFtZSI8PHN0ZDo6ZW5kbDsKCX0KfTsKClZDb25zOjp+VkNvbnMoKQp7CglpZihjYWxsZXIgPT0gdGhpcykKCQliYXNlLT5PbkNyZWF0ZShwYXJhbSk7CgllbHNlCgkJY2FsbGVyLT5TZXQoYmFzZSwgcGFyYW0pOwp9CgppbnQgbWFpbigpCnsKCU1haW5GcmFtZSBmcmFtZTsKCglpbnQgaT0wOwoJc3RkOjpjaW4+Pmk7CglyZXR1cm4gMDsKfQoK