`

Dynamic_cast 和 RTTI

    博客分类:
  • C++
 
阅读更多

 

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;  
}  

 

分享到:
评论

相关推荐

    dynamic_cast,static_cast 和 reinterpret_cast

    讨论 dynamic_cast,static_cast&lt;&gt; 和 reinterpret_cast&lt;&gt; and Runtime Type Information

    C++ 中dynamic_castlt;gt;的使用方法小结

    对指针进行dynamic_cast,失败返回null,成功返回正常cast后的对象指针; 对引用进行dynamic_cast,失败抛出一个异常,成功返回正常cast后的对象引用。 注意:dynamic_cast在将父类cast到子类时,父类必须要有虚...

    C++ 中RTTI的使用方法详解

    C++ 中RTTI的使用方法详解 RTTI是运行阶段类型识别(Runtime Type Identification)的简称。...如果可能的话,dynamic_cast 运算符将使用一个指向基类的指针来生成一个指向派生类的指针;否则,该运算符返回0——空

    Thinking_in_C++_中文版【高清+可搜索+可编辑/复制/粘贴+无密码】

    triangle* 七p = dynamic_cast*&gt;(sh); 它自增。如果可以控制类的源代码并可以修改它,当然可以这样做。下面这个例子用来计算 s h a p e的个数,它用了静态数据成员和动态映射两种方法: 384 C + +编程思想 下载 //: ...

    compex:用于以机器可读格式转储 C++ 类型信息的 GCCclang 编译器插件

    复杂的compex 为 GCC 和 clang 提供插件,用于从 C++ 中提取类型信息。 该插件本身以 YAML 格式转储有关结构、字段和方法的信息,使您可以轻松地使用 C++ ... compex 与 C++ RTTI ( dynamic_cast ) 完全无关,也不需要

    Google C++ 编码规范

    4) dynamic_cast:除测试外不要使用,除单元测试外,如果你需要在运行时确定类型信息,说明设计有缺陷(参考RTTI)。 10. 前置自增和自减(Preincrement and Predecrement) 对于迭代器和其他模板对象使用前缀...

    C++ Primer中文版(第5版)李普曼 等著 pdf 1/3

    Lippman丰富的实践经验和C++标准委员会原负责人Josée Lajoie对C++标准深入理解的完美结合,已经帮助全球无数程序员学会了C++。 对C++基本概念和技术全面而且权威的阐述,对现代C++编程风格的强调,使本书成为C++...

    C++Primer(第5版 )中文版(美)李普曼等著.part2.rar

    Lippman丰富的实践经验和C++标准委员会原负责人Josée Lajoie对C++标准深入理解的完美结合,已经帮助全球无数程序员学会了C++。 对C++基本概念和技术全面而且权威的阐述,对现代C++编程风格的强调,使本书成为C++...

    C++ Primer第四版【中文高清扫描版】.pdf

    书中不但新增大量教学辅助内容,用于强调重要的知识点,提醒常见的错误,推荐优秀的编程实践,给出使用提示,还包含大量来自实战的示例和习题。对C++基本概念和技术全面而且权威的阐述,对现代C++编程风格的强调,使...

    Google C++ Style Guide(Google C++编程规范)高清PDF

    Other C++ Features Reference Arguments Function Overloading Default Arguments Variable-Length Arrays and alloca() Friends Exceptions Run-Time Type Information (RTTI) Casting Streams Preincrement and ...

    深度探索模C++对象模型PDF

    第0章 导读(译者的话) ...Type-Safe Dynamic Cast(保证安全的动态转型) References并不是Pointers Typeid运算符 7.4 效率有了,弹性呢? 动态共享函数库(Dynamic Shared Libraries) 共享内存(Shared Memory)

    深度探索C++对象模型 超清版

    第0章 导读(译者的话) ...Type-Safe Dynamic Cast(保证安全的动态转型) References并不是Pointers Typeid运算符 7.4 效率有了,弹性呢? 动态共享函数库(Dynamic Shared Libraries) 共享内存(Shared Memory)

    《深度探索C++对象模型》(Stanley B·Lippman[美] 著,侯捷 译)

    本书重点:探索“对象导向...Type-Safe Dynamic Cast(保证安全的动态转型) References并不是Pointers Typeid运算符 7.4 效率有了,弹性呢? 动态共享函数库(Dynamic Shared Libraries) 共享内存(Shared Memory)

    Thinking in Java 4th Edition

    What’s Inside Preface 1 Java SE5 and SE6 .................. 2 Java SE6 ............................................The 4th edition...........................Changes ...........................................

Global site tag (gtag.js) - Google Analytics