using namespace std;
class Person;
typedef void (Person::*AccessObjectCallbackFunction)();
class AccessObject;
std::vector<AccessObject*> accessObjectList_;
class AccessObjectListener
{
public:
virtual void listenerCallback()=0;
};
class AccessObject
{
public:
AccessObject(Person& owner)
: owner_(owner)
, callback_(0)
, listener_(0)
{
accessObjectList_.push_back(this);
}
void setCallback(AccessObjectCallbackFunction callback) { callback_ = callback; }
void setListener(AccessObjectListener* listener) { listener_ = listener; }
void callback() {
((&owner_)->*callback_)();
}
void listenerCallback() {
listener_->listenerCallback();
}
private:
Person& owner_;
AccessObjectCallbackFunction callback_;
AccessObjectListener* listener_;
};
class Person : virtual public AccessObjectListener
{
public:
Person() : accessObject_(*this)
{
accessObject_.setCallback(&Person::callback);
accessObject_.setListener(this);
}
void callback() {
printf("Person::callback\n");
}
void listenerCallback() {
printf("Person::listener\n");
}
private:
AccessObject accessObject_;
};
class Pioneer : public Person, virtual public AccessObjectListener
{
public:
Pioneer() : accessObject_(*this)
{
accessObject_.setCallback(static_cast<AccessObjectCallbackFunction>(&Pioneer::callback));
accessObject_.setListener(this);
}
void callback() {
printf("Pioneer::callback\n");
}
void listenerCallback() {
printf("Pioneer::listener\n");
}
private:
AccessObject accessObject_;
};
int main()
{
Pioneer* pioneer = new Pioneer();
printf("MemberFunctionCallback.\n");
for (std::vector<AccessObject*>::iterator it = accessObjectList_.begin(); it != accessObjectList_.end(); ++it) {
(*it)->callback();
}
printf("ListenerCallback.\n");
for (std::vector<AccessObject*>::iterator it = accessObjectList_.begin(); it != accessObjectList_.end(); ++it) {
(*it)->listenerCallback();
}
delete pioneer;
return 0;
}