#include <iostream>
using namespace std;
class Man;
class Dog{
public:
Man *man;
void (Man::*callbackFunc)(void);
void setCallback(Man *_man,void (Man::*_callbackFunc)(void)){
callbackFunc=_callbackFunc;
man=_man;
}
void bite();
};
class Man
{
public:
void haveDogBiteYou(){
Dog *myDog = new Dog();
myDog->setCallback(this,&Man::sayAh); // How???
myDog->bite();
}
void sayAh(){
cout << "AHHHHHH!";
}
};
void Dog::bite(){
(man->*callbackFunc)();
}
int main() {
Man m;
m.haveDogBiteYou();
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKY2xhc3MgTWFuOwoKY2xhc3MgRG9newpwdWJsaWM6CiAgICAKICAgIE1hbiAqbWFuOwogICAgdm9pZCAoTWFuOjoqY2FsbGJhY2tGdW5jKSh2b2lkKTsKCiAgICB2b2lkIHNldENhbGxiYWNrKE1hbiAqX21hbix2b2lkIChNYW46OipfY2FsbGJhY2tGdW5jKSh2b2lkKSl7CiAgICAgICAgY2FsbGJhY2tGdW5jPV9jYWxsYmFja0Z1bmM7CiAgICAgICAgbWFuPV9tYW47CiAgICB9CgogICAgdm9pZCBiaXRlKCk7Cgp9OwoKY2xhc3MgTWFuCnsKcHVibGljOgogICAgdm9pZCBoYXZlRG9nQml0ZVlvdSgpewogICAgICAgIERvZyAqbXlEb2cgPSBuZXcgRG9nKCk7CiAgICAgICAgbXlEb2ctPnNldENhbGxiYWNrKHRoaXMsJk1hbjo6c2F5QWgpOyAvLyBIb3c/Pz8KICAgICAgICBteURvZy0+Yml0ZSgpOwogICAgfQoKICAgIHZvaWQgc2F5QWgoKXsKICAgICAgICBjb3V0IDw8ICJBSEhISEhIISI7CiAgICB9Cn07CgoKdm9pZCBEb2c6OmJpdGUoKXsKCShtYW4tPipjYWxsYmFja0Z1bmMpKCk7Cn0KCgoKaW50IG1haW4oKSB7CglNYW4gbTsKCW0uaGF2ZURvZ0JpdGVZb3UoKTsKCXJldHVybiAwOwp9