Dynamic_castとRTTI

3027 ワード

include <iostream>  
#include <list>  
#include "boost/shared_ptr.hpp"  
using namespace std;  
using namespace boost;  
  
//   
class Observer  
{  
public:  
    //   
    virtual void update(const int i) = 0;  
};  
  
// A  
class ObserverA : public Observer  
{  
public:  
    virtual void update(const int i)  
    {  
        cout << "ObserverA.update(" << i << ")" << endl;  
    }  
};  
  
// B  
class ObserverB : public Observer  
{  
public:  
    virtual void update(const int i)  
    {  
        cout << "ObserverB.update(" << i << ")" << endl;  
    }  
};  
  
//   
class Subject  
{  
public:  
    virtual ~Subject()  
    {  
  
    }  
    //   
    virtual void reg(const shared_ptr<Observer>& pObs) = 0;  
    //   
    virtual void unreg(const shared_ptr<Observer>& pObs) = 0;  
    //   
    virtual void notify(const int i) = 0;  
};  
  
// A  
class SubjectA : public Subject  
{  
public:  
    virtual void reg(const shared_ptr<Observer>& pObs)  
    {  
        m_lstObs.push_back(pObs);  
    }  
    virtual void unreg(const shared_ptr<Observer>& pObs)  
    {  
        for (list<shared_ptr<Observer> >::iterator it = m_lstObs.begin();  
            it != m_lstObs.end();)  
        {  
            if (pObs == *it) m_lstObs.erase(it++);  
            else ++it;  
        }  
    }  
    virtual void notify(const int i)  
    {  
        for (list<shared_ptr<Observer> >::iterator it = m_lstObs.begin();  
            it != m_lstObs.end(); ++it)  
        {  
            (*it)->update(i);  
        }  
    }  
protected:  
    //   
    list<shared_ptr<Observer> > m_lstObs;  
};  
  
int main()  
{  
    // pSubA  
    shared_ptr<Subject> pSubA(new SubjectA);  
    // pObsA  
    shared_ptr<Observer> pObsA(new ObserverA);  
    // pObsB  
    shared_ptr<Observer> pObsB(new ObserverB);  
    // pObsA  
    pSubA->reg(pObsA);  
    // pObsB  
    pSubA->reg(pObsB);  
    //   
    pSubA->notify(1);                //   
                                    //ObserverA.update(1)  
                                    //ObserverB.update(1)  
    // pObsA   
    pSubA->unreg(pObsA);  
    //   
    pSubA->notify(2);                //   
                                    //ObserverB.update(2)  
    return 0;  
}