程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> C++ 沉思錄之代理類

C++ 沉思錄之代理類

編輯:關於C語言

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

測試結果

210428518.jpg

本文出自 “風清揚song” 博客,請務必保留此出處http://2309998.blog.51cto.com/2299998/1303187

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved