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<> and Runtime Type Information
对指针进行dynamic_cast,失败返回null,成功返回正常cast后的对象指针; 对引用进行dynamic_cast,失败抛出一个异常,成功返回正常cast后的对象引用。 注意:dynamic_cast在将父类cast到子类时,父类必须要有虚...
C++ 中RTTI的使用方法详解 RTTI是运行阶段类型识别(Runtime Type Identification)的简称。...如果可能的话,dynamic_cast 运算符将使用一个指向基类的指针来生成一个指向派生类的指针;否则,该运算符返回0——空
triangle* 七p = dynamic_cast*>(sh); 它自增。如果可以控制类的源代码并可以修改它,当然可以这样做。下面这个例子用来计算 s h a p e的个数,它用了静态数据成员和动态映射两种方法: 384 C + +编程思想 下载 //: ...
复杂的compex 为 GCC 和 clang 提供插件,用于从 C++ 中提取类型信息。 该插件本身以 YAML 格式转储有关结构、字段和方法的信息,使您可以轻松地使用 C++ ... compex 与 C++ RTTI ( dynamic_cast ) 完全无关,也不需要
4) dynamic_cast:除测试外不要使用,除单元测试外,如果你需要在运行时确定类型信息,说明设计有缺陷(参考RTTI)。 10. 前置自增和自减(Preincrement and Predecrement) 对于迭代器和其他模板对象使用前缀...
Lippman丰富的实践经验和C++标准委员会原负责人Josée Lajoie对C++标准深入理解的完美结合,已经帮助全球无数程序员学会了C++。 对C++基本概念和技术全面而且权威的阐述,对现代C++编程风格的强调,使本书成为C++...
Lippman丰富的实践经验和C++标准委员会原负责人Josée Lajoie对C++标准深入理解的完美结合,已经帮助全球无数程序员学会了C++。 对C++基本概念和技术全面而且权威的阐述,对现代C++编程风格的强调,使本书成为C++...
书中不但新增大量教学辅助内容,用于强调重要的知识点,提醒常见的错误,推荐优秀的编程实践,给出使用提示,还包含大量来自实战的示例和习题。对C++基本概念和技术全面而且权威的阐述,对现代C++编程风格的强调,使...
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 ...
第0章 导读(译者的话) ...Type-Safe Dynamic Cast(保证安全的动态转型) References并不是Pointers Typeid运算符 7.4 效率有了,弹性呢? 动态共享函数库(Dynamic Shared Libraries) 共享内存(Shared Memory)
第0章 导读(译者的话) ...Type-Safe Dynamic Cast(保证安全的动态转型) References并不是Pointers Typeid运算符 7.4 效率有了,弹性呢? 动态共享函数库(Dynamic Shared Libraries) 共享内存(Shared Memory)
本书重点:探索“对象导向...Type-Safe Dynamic Cast(保证安全的动态转型) References并不是Pointers Typeid运算符 7.4 效率有了,弹性呢? 动态共享函数库(Dynamic Shared Libraries) 共享内存(Shared Memory)
What’s Inside Preface 1 Java SE5 and SE6 .................. 2 Java SE6 ............................................The 4th edition...........................Changes ...........................................