#include #include #include // for Smart Pointers using namespace std; using namespace tr1; class Observer { public: Observer() {} void update() { cout << "Signal Detected!" << endl; } }; class Subject { typedef weak_ptr WPtr; list obs; class Eq: unary_function { WPtr lhs; public: Eq(WPtr wp): lhs(wp) {} bool operator()(WPtr rhs) { return lhs.lock() == rhs.lock(); } }; public: Subject(): obs(0) {} void attach(WPtr o) { obs.push_back(o); } void detach(WPtr o) { obs.remove_if(Eq(o)); } void notify() { list::iterator oiter = obs.begin(); while (oiter != obs.end()) { if (shared_ptr tmp = oiter->lock()) tmp->update(); else cout << "No More Exist!" << endl; ++oiter; } } }; int main() { Subject s; shared_ptr o0(new Observer()); s.attach(o0); shared_ptr o1(new Observer()); s.attach(o1); shared_ptr o2(new Observer()); s.attach(o2); o0.reset(); // destruct Observer -> No More Exist! s.detach(o1); // remove from notification list -> Just Unseen from Subject class s.notify(); return 0; }