[ create a new paste ] login | about

Link: http://codepad.org/oWmh1Hpn    [ raw code | output | fork ]

C++, pasted on Jan 20:
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;
}


Output:
1
2
3
4
5
6
MemberFunctionCallback.
Person::callback
Pioneer::callback
ListenerCallback.
Pioneer::listener
Pioneer::listener


Create a new paste based on this one


Comments: