codepad
[
create a new paste
]
login
|
about
Language:
C
C++
D
Haskell
Lua
OCaml
PHP
Perl
Plain Text
Python
Ruby
Scheme
Tcl
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; }
Private
[
?
]
Run code
Submit