Dynamic_cast 및 RTTI

3088 단어 dynamic
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;  
}  

좋은 웹페이지 즐겨찾기