#include <iostream>
class First;
// Typedefs make this much more readable: http://w...content-available-to-author-only...t.com/c++-faq-lite/pointers-to-members.html#faq-33.5
typedef void (First::*SecondTriggeredCallback)(void);
// And macros make the call much more readable: http://w...content-available-to-author-only...t.com/c++-faq-lite/pointers-to-members.html#faq-33.6
#define CALL_MEMBER_FN(object,ptrToMember) ((object).*(ptrToMember))
class Second
{
public:
// You'll also need an *instance* of the First class
Second(SecondTriggeredCallback SecondTriggered, First& first)
{
CALL_MEMBER_FN(first, SecondTriggered)();
}
};
class First
{
private:
Second *second;
public:
First()
{
std::cout << "first class was created" << std::endl;
second = new Second(&First::SecondTriggered, *this);
}
~First()
{
delete second;
}
void SecondTriggered()
{
std::cout << "second class was created and responded" << std::endl;
}
};
int main()
{
First first;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKY2xhc3MgRmlyc3Q7CgovLyBUeXBlZGVmcyBtYWtlIHRoaXMgbXVjaCBtb3JlIHJlYWRhYmxlOiBodHRwOi8vdy4uLmNvbnRlbnQtYXZhaWxhYmxlLXRvLWF1dGhvci1vbmx5Li4udC5jb20vYysrLWZhcS1saXRlL3BvaW50ZXJzLXRvLW1lbWJlcnMuaHRtbCNmYXEtMzMuNQp0eXBlZGVmIHZvaWQgKEZpcnN0OjoqU2Vjb25kVHJpZ2dlcmVkQ2FsbGJhY2spKHZvaWQpOwoKLy8gQW5kIG1hY3JvcyBtYWtlIHRoZSBjYWxsIG11Y2ggbW9yZSByZWFkYWJsZTogIGh0dHA6Ly93Li4uY29udGVudC1hdmFpbGFibGUtdG8tYXV0aG9yLW9ubHkuLi50LmNvbS9jKystZmFxLWxpdGUvcG9pbnRlcnMtdG8tbWVtYmVycy5odG1sI2ZhcS0zMy42CiNkZWZpbmUgQ0FMTF9NRU1CRVJfRk4ob2JqZWN0LHB0clRvTWVtYmVyKSAoKG9iamVjdCkuKihwdHJUb01lbWJlcikpCgpjbGFzcyBTZWNvbmQKewpwdWJsaWM6CiAgICAvLyBZb3UnbGwgYWxzbyBuZWVkIGFuICppbnN0YW5jZSogb2YgdGhlIEZpcnN0IGNsYXNzCiAgICBTZWNvbmQoU2Vjb25kVHJpZ2dlcmVkQ2FsbGJhY2sgU2Vjb25kVHJpZ2dlcmVkLCBGaXJzdCYgZmlyc3QpCiAgICB7CiAgICAgICAgQ0FMTF9NRU1CRVJfRk4oZmlyc3QsIFNlY29uZFRyaWdnZXJlZCkoKTsKICAgIH0KfTsKCmNsYXNzIEZpcnN0CnsKcHJpdmF0ZToKICAgIFNlY29uZCAqc2Vjb25kOwoKcHVibGljOgogICAgRmlyc3QoKQogICAgewogICAgICAgIHN0ZDo6Y291dCA8PCAiZmlyc3QgY2xhc3Mgd2FzIGNyZWF0ZWQiIDw8IHN0ZDo6ZW5kbDsKICAgICAgICBzZWNvbmQgPSBuZXcgU2Vjb25kKCZGaXJzdDo6U2Vjb25kVHJpZ2dlcmVkLCAqdGhpcyk7CiAgICB9CgogICAgfkZpcnN0KCkKICAgIHsKICAgICAgICBkZWxldGUgc2Vjb25kOwogICAgfQoKICAgIHZvaWQgU2Vjb25kVHJpZ2dlcmVkKCkKICAgIHsKICAgICAgICBzdGQ6OmNvdXQgPDwgInNlY29uZCBjbGFzcyB3YXMgY3JlYXRlZCBhbmQgcmVzcG9uZGVkIiA8PCBzdGQ6OmVuZGw7CiAgICB9Cn07CgppbnQgbWFpbigpCnsKICAgIEZpcnN0IGZpcnN0Owp9Cg==