設計模式一(續)
阿新 • • 發佈:2017-05-07
pan har cnblogs 變量 ring 區別 ack iostream 模式
本篇是接著設計模一:觀察者模式的續寫。
為什麽要寫這一篇呢:
java在main函數裏new出的對象都是局部變量,而用C++ 在main函數裏new出來的都是 動態分配到堆區的。
那麽可不可以按照java的思路來寫呢。
這就是寫本篇的原因了:C++完全可以按照java的思路來實現(使用引用)
附上代碼:
#include "stdafx.h" #include<iostream> #include<string> #include<vector> using namespace std; class Observer; class Subject; classSubject { public: Subject() { msg="orinal msg"; } void add(Observer &ob) { vec.push_back(ob); } void show() { cout<<"broadcast:msg is:"<<msg<<endl; } void change(string msg) { this->msg=msg; notification(); }void notification(); private: vector<Observer> vec; string msg; }; class Observer { public: Observer(Subject &sub):sub(sub) { this->sub.add(*this); //這裏使用了*this this指的是指向對象本身的指針,*this 指的是對象本身。 } void Showdate() { sub.show(); } private: Subject⊂ }; void Subject::notification() { vector<Observer>::iterator v = vec.begin(); while( v != vec.end()) { (*v).Showdate(); v++; } } int _tmain(int argc, _TCHAR* argv[]) { Subject sub= Subject(); Observer ob1= Observer(sub); Observer ob2= Observer(sub); sub.change("asdasd"); return 0; }
這裏使用了引用類型,引用類型 的格式 TYPE &A =XXX,之所以稱為引用 指的就是該引用變量和變量本身是同一塊內存單元。
這樣就與JAVA相同了。這種寫法和之前那篇文章的寫法的區別之一就是 本文所用變量皆為局部變量。
之前的文章為什麽要用指針呢,因為在傳遞參數時如果不用指針那麽函數內部操作的實際上是局部變量(該程序對局部變量的操作沒有意義)
而使用引用完全可以做的和指針相同的功能,區別只是內存分配的問題。
需要註意一點的是 如果類的成員變量是引用類型,那麽引用類型只能用初始化表的形式初始化。
設計模式一(續)