class Observer(Observer.h)
#ifndef OBASER_H#define OBASER_H#include"Observerable.h"class Observerable;class Observer{private: Observerable *subject_;public: virtual void update(){}; void observer(Observerable *s); ~Observer();};#endif class Observerable(Observerable.h) #ifndef OBASERVERABLE_H#define OBASERVERABLE_H#include<iostream>#include<vector>#include<algorithm>class Observer;class Observerable{private: std::vector<Observer*> obsPtrs;public: void register_obs(Observer *obs_); void unregister_obs(Observer *obs); void notificate_obs();};#endif 我们可以看到在两个类中,对对方都加了一次声明如: class Observer class Observerable 这里我们只是告诉编译器,我们有这么一个类存在,不是一般的错误或者什么重定义乱定义之类的。Observer.cpp
#include"Observer.h"#include"Observerable.h"void Observer::observer(Observerable *s){ s->register_obs(this);} Observer::~Observer(){ subject_->unregister_obs(this);} Observerable.cpp #include"Observerable.h"#include"Observer.h" void Observerable::notificate_obs(){ for(int i=0;i<obsPtrs.size(); i++){ if(obsPtrs[i]){ obsPtrs[i]->update(); } }}void Observerable::register_obs(Observer *obs_){ obsPtrs.push_back(obs_); }void Observerable::unregister_obs(Observer *obs){ std::vector<Observer*>::iterator obsIter; if((obsIter=std::find(obsPtrs.begin(),obsPtrs.end(),obs))!=obsPtrs.end()){ obsPtrs.erase(obsIter); }} 而且在两个具体实现的文件中如Observerable.cpp和Observer.cpp中,我们都分别引用了对方的头文件,这回我们就得知道对方类的 成员函数有哪些了,以及其函数接口。 来自为知笔记(Wiz)转载于:https://www.cnblogs.com/yml435/p/4664372.html
