在讀C++沉思錄時,有一個要求把不同的對象存入同一個數組中,並且可以出發一定的行為。個人感覺與觀察者模式有點像。
例如要求將停車場中的不同的汽車對象保存在汽車廠的數組中。並實現一些汽車的基本共有的行為。
通過實現原有的對象的一個深拷貝,之後在代理類中的汽車基類對象的指針指向深拷貝對象,通過多態來實現汽車的基本行為。代碼如下:
汽車的基類純虛函數,為繼承使用,不能夠實例化具體對象,當能聲明指針對象)
/************************************************* 各種汽車基類 **************************************************/ class Vechle { public: virtual void Weight() = 0; virtual void Start() = 0; virtual Vechle* Copy() const = 0; };
各種具體汽車的實現
/************************************* 具體交通工具實現,小汽車 *************************************/ class SmallCar :public Vechle { public: SmallCar(){}; ~SmallCar(){}; void Weight(); void Start(); Vechle* Copy() const; }; /************************* 實現基類的虛函數,實現多態 *************************/ void SmallCar::Weight() { cout<<"小汽車重400斤"<<endl; } void SmallCar::Start() { cout<<"小汽車啟動了"<<endl; } //這裡通過Copy函數實現對象本身的一個副本拷貝。 Vechle* SmallCar::Copy() const { //返回對象本身的一個副本 return new SmallCar(*this); } /************************************* 具體交通工具實現,大汽車 *************************************/ class BigBus :public Vechle { public: BigBus(){}; ~BigBus(){}; void Weight(); void Start(); Vechle* Copy() const; }; /************************* 實現基類的虛函數,實現多態 *************************/ void BigBus::Weight() { cout<<"大汽車重1.5噸"<<endl; } void BigBus::Start() { cout<<"大汽車啟動了"<<endl; } //這裡通過Copy函數實現對象本身的一個副本拷貝。 Vechle* BigBus::Copy() const { //返回對象本身的一個副本 return new BigBus(*this); }
汽車代理類:
/******************************* 停車場的實現,可以停放各種車輛 可以定義停車場數組保存各種類型的小車 *******************************/ class VechleSurrogate { public: VechleSurrogate(); ~VechleSurrogate(); VechleSurrogate(const Vechle &tVechle); VechleSurrogate(const VechleSurrogate &tVechleSurrogate); VechleSurrogate& operator = (const VechleSurrogate &tVechleSurrogate); void Weight(); void Start(); private: Vechle *m_Vechle; }; VechleSurrogate::VechleSurrogate() { m_Vechle = 0; } VechleSurrogate::~VechleSurrogate() { if(NULL != m_Vechle) { delete m_Vechle; } } //通過基類指針實現拷貝構造 VechleSurrogate::VechleSurrogate(const Vechle &tVechle) { m_Vechle=tVechle.Copy(); } //拷貝構造函數 /*VechleSurrogate::VechleSurrogate(const VechleSurrogate &tVechleSurrogate) { m_Vechle = tVechleSurrogate.m_Vechle?tVechleSurrogate.m_Vechle->Copy():0; } */ //復制構造函數 VechleSurrogate& VechleSurrogate::operator = (const VechleSurrogate &tVechleSurrogate) { if(&tVechleSurrogate != this) { if(NULL != this->m_Vechle) { delete this->m_Vechle; } m_Vechle = tVechleSurrogate.m_Vechle?tVechleSurrogate.m_Vechle->Copy():0; } return *this; } //實現成員函數的虛函數調用 void VechleSurrogate::Weight() { m_Vechle->Weight(); } void VechleSurrogate::Start() { m_Vechle->Start(); }
汽車廠的具體實現
int main(int argc, char* argv[]) { char c; VechleSurrogate ArrayVechleSurrogate[3]; SmallCar *tSmallCar = new SmallCar(); BigBus *tBigBus = new BigBus(); ArrayVechleSurrogate[0] = *tSmallCar; ArrayVechleSurrogate[1] = *tBigBus; ArrayVechleSurrogate[0].Start(); ArrayVechleSurrogate[1].Start(); ArrayVechleSurrogate[0].Weight(); ArrayVechleSurrogate[1].Weight(); cout<<endl<<"按任意鍵退出......."<<endl; c = getchar(); return 0; }
測試結果
本文出自 “風清揚song” 博客,請務必保留此出處http://2309998.blog.51cto.com/2299998/1303187