#include <vector>
#include <iostream>
class BaseWindow;
class Button
{
public:
typedef void (BaseWindow::*BehaviorPtr)(Button *);
private:
BaseWindow* parent;
BehaviorPtr behavior;
public:
Button(BaseWindow* parent);
template <typename T> void SetBehavior(T behavior)
{
this->behavior = static_cast<BehaviorPtr>(behavior);
}
void Clicked(/*coords*/)
{
if(1)
{
(parent->*behavior)(this);
}
}
};
class BaseWindow
{
std::vector<Button*> Buttons;
public:
void WindowClicked(/*coords*/)
{
for (std::vector<Button*>::iterator it = Buttons.begin(); it != Buttons.end(); ++it)
{
(*it)->Clicked(/*coords*/);
}
}
void AddButton(Button* butt)
{
Buttons.push_back(butt);
}
};
Button::Button(BaseWindow* parent) : parent(parent), behavior()
{
parent->AddButton(this);
}
class UserWindow:public BaseWindow
{
Button MyButton1, MyButton2;
public:
void FunctionForButton1(Button* butt){ std::cout<< "Say Hello, my sweet first button" << std::endl;}
void FunctionForButton2(Button* butt){ std::cout<< "Ha ha ha!!!" << std::endl;}
UserWindow():MyButton1(this), MyButton2(this)
{
MyButton1.SetBehavior(&UserWindow::FunctionForButton1);
MyButton2.SetBehavior(&UserWindow::FunctionForButton2);
}
};
int main()
{
UserWindow w;
w.WindowClicked();
}
I2luY2x1ZGUgPHZlY3Rvcj4KI2luY2x1ZGUgPGlvc3RyZWFtPgpjbGFzcyBCYXNlV2luZG93OwpjbGFzcyBCdXR0b24KewpwdWJsaWM6CiAgICAgICAgICAgIHR5cGVkZWYgdm9pZCAoQmFzZVdpbmRvdzo6KkJlaGF2aW9yUHRyKShCdXR0b24gKik7CiAgICAgICAgICAgIApwcml2YXRlOiAgICAgICAgICAgIAogICAgQmFzZVdpbmRvdyogcGFyZW50OwogICAgQmVoYXZpb3JQdHIgYmVoYXZpb3I7CiAgICAKcHVibGljOgogICAgICAgICAgICBCdXR0b24oQmFzZVdpbmRvdyogcGFyZW50KTsKICAgICAgICAgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHZvaWQgU2V0QmVoYXZpb3IoVCBiZWhhdmlvcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT5iZWhhdmlvciA9IHN0YXRpY19jYXN0PEJlaGF2aW9yUHRyPihiZWhhdmlvcik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdm9pZCBDbGlja2VkKC8qY29vcmRzKi8pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYoMSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocGFyZW50LT4qYmVoYXZpb3IpKHRoaXMpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KfTsKY2xhc3MgQmFzZVdpbmRvdwp7CiAgICAgICAgICAgIHN0ZDo6dmVjdG9yPEJ1dHRvbio+IEJ1dHRvbnM7CnB1YmxpYzoKICAgICAgICAgICAgdm9pZCBXaW5kb3dDbGlja2VkKC8qY29vcmRzKi8pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBmb3IgKHN0ZDo6dmVjdG9yPEJ1dHRvbio+OjppdGVyYXRvciBpdCA9IEJ1dHRvbnMuYmVnaW4oKTsgaXQgIT0gQnV0dG9ucy5lbmQoKTsgKytpdCkgCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqaXQpLT5DbGlja2VkKC8qY29vcmRzKi8pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICB2b2lkIEFkZEJ1dHRvbihCdXR0b24qIGJ1dHQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1dHRvbnMucHVzaF9iYWNrKGJ1dHQpOwogICAgICAgICAgICB9Cn07CkJ1dHRvbjo6QnV0dG9uKEJhc2VXaW5kb3cqIHBhcmVudCkgOiBwYXJlbnQocGFyZW50KSwgYmVoYXZpb3IoKQp7CiAgICBwYXJlbnQtPkFkZEJ1dHRvbih0aGlzKTsKfQogICAgICAgICAgICAKY2xhc3MgVXNlcldpbmRvdzpwdWJsaWMgQmFzZVdpbmRvdwp7CiAgICAgICAgICAgIEJ1dHRvbiBNeUJ1dHRvbjEsIE15QnV0dG9uMjsKcHVibGljOgogICAgICAgICAgICB2b2lkIEZ1bmN0aW9uRm9yQnV0dG9uMShCdXR0b24qIGJ1dHQpeyBzdGQ6OmNvdXQ8PCAiU2F5IEhlbGxvLCBteSBzd2VldCBmaXJzdCBidXR0b24iIDw8IHN0ZDo6ZW5kbDt9CiAgICAgICAgICAgIHZvaWQgRnVuY3Rpb25Gb3JCdXR0b24yKEJ1dHRvbiogYnV0dCl7IHN0ZDo6Y291dDw8ICJIYSBoYSBoYSEhISIgPDwgc3RkOjplbmRsO30KICAgICAgICAgICAgVXNlcldpbmRvdygpOk15QnV0dG9uMSh0aGlzKSwgTXlCdXR0b24yKHRoaXMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgTXlCdXR0b24xLlNldEJlaGF2aW9yKCZVc2VyV2luZG93OjpGdW5jdGlvbkZvckJ1dHRvbjEpOwogICAgICAgICAgICAgICAgICAgICAgICBNeUJ1dHRvbjIuU2V0QmVoYXZpb3IoJlVzZXJXaW5kb3c6OkZ1bmN0aW9uRm9yQnV0dG9uMik7CiAgICAgICAgICAgIH0KfTsKaW50IG1haW4oKQp7CiAgICBVc2VyV2luZG93IHc7CiAgICB3LldpbmRvd0NsaWNrZWQoKTsKfQo=