此文记录《C++沉思录》 一书中的代理章节中的代码。
/******************************************************************************
Module: surrogate.h
Purpose: 代理是为了解决继承和容器问题而提出的。容器只能容纳同种类型的对象。
而在继承层次里面有多种变量类型,虽然他们相互关联,也不能找到一个很
有效的办法将之放入容器,传统的方法是以指针作为中间层,在容器内部存
储指针,而这样又会带来内存管理的麻烦。在C++里面,通常采用代理的方式
解决这一问题,将代理作为一个中间层。
Note: 注意空指针的检测,注意const引用参数的使用,注意自我赋值的检测
内容参照Andrew Koenig 和 Barbara Moo 的 《C++沉思录》
******************************************************************************/
#ifndef _SURROGATE_H
#define _SURROGATE_H
#include <iostream>
// the base class
class Vehicle {
public:
virtual double weight() const = 0;
virtual void start() = 0;
virtual Vehicle* copy() const = 0;
virtual ~Vehicle() { std::cout << "~Vehicle()" << std::endl; }
//...
};
class RoadVehicle: public Vehicle {
public:
double weight() const;
void start();
Vehicle* copy() const;
~RoadVehicle() { std::cout << "~RoadVehicle()" << std::endl; }
/*...*/};
class AutoVehicle: public RoadVehicle {
public:
double weight() const;
void start();
Vehicle* copy() const;
~AutoVehicle() { std::cout << "~AutoVehicle()" << std::endl; }
/*...*/
};
//class Aircraft: public Vehicle { /* ... */ };
//class Helicopter: public Aircraft { /* ... */ };
class VehicleSurrogate{
public:
VehicleSurrogate();
~VehicleSurrogate();
VehicleSurrogate(const Vehicle & v);
VehicleSurrogate(const VehicleSurrogate & vs);
VehicleSurrogate& operator=(const VehicleSurrogate& vs);
//methods from class Vehicle
double weight() const;
void start();
private:
Vehicle* vp;
};
#endif
/******************************************************************************
Module: surrogate.cpp
******************************************************************************/
#include <iostream>
#include "surrogate.h"
using namespace std;
double RoadVehicle::weight() const
{
return 200.0;
}
void RoadVehicle::start()
{
cout << "RoadVehicle start" << endl;
}
Vehicle* RoadVehicle::copy() const
{
return new RoadVehicle(*this);
}
double AutoVehicle::weight() const
{
return 100.0;
}
void AutoVehicle::start()
{
cout << "AutoVehicle start" << endl;
}
Vehicle* AutoVehicle::copy() const
{
return new AutoVehicle(*this);
}
VehicleSurrogate::VehicleSurrogate():vp(0){}
VehicleSurrogate::~VehicleSurrogate()
{
delete vp;
cout << "~VehicleSurrogate()" << endl;
}
VehicleSurrogate::VehicleSurrogate(const Vehicle &v)
:vp(v.copy()){}
VehicleSurrogate::VehicleSurrogate(const VehicleSurrogate & vs)
:vp(vs.vp ? vs.vp->copy() : 0){}
VehicleSurrogate& VehicleSurrogate::operator=(const VehicleSurrogate& vs)
{
if(&vs != this) // check for if we assign itself
{
delete vp;
vp = vs.vp ? vs.vp->copy() : 0;
}
return *this;
}
double VehicleSurrogate::weight() const
{
if(vp == 0) // check for null pointer
{
throw "Empty VehicleSurrogate.weight()";
}
return vp->weight();
}
void VehicleSurrogate::start()
{
if(vp == 0) // check for null pointer
{
throw "Empty VehicleSurrogate.start()";
}
return vp->start();
}
分享到:
相关推荐
基本C++学习Essential C++Effective C++C++沉思录中面向对象的部分
c++沉思录.pdf c++学习的必备数据,
c++沉思录的21章代码 没有下载的,只是书上有些分散的代码片段,我录入了一下,供需要的人下载使用,节省时间
内容索引:VC/C++源码,随书源码,随书源码 C++ 沉思录随书实例源代码,运行于C++环境,都是些小程序,C++打基础的用户学习学习。
学习C++的一本好书~!C++沉思录~!学习C的必备书之一~
《C++沉思录》--十年编程生涯的真知灼见
C++沉思/C++编程思想, 两本很经典的图书
《C++沉思录》第八章 “一个面向对象程序的范例”
#include <stdio.h>class Trace{public:Trace(){noisy=0;f=stdout;}Trace(FILE*ff){noisy=0;f=ff;}void print(char*s){if (noisy)fprintf(f,"%s",s);}void on(){noisy=1;}void off(){noisy=0;}private:int noisy;...
本书适合有一定经验的c++程序员阅读学习,可以帮助你加强提高技术能力,成为c++程序设计的高手
经典书籍值得珍藏留着 以后慢慢用
关于C++的一本很好的书!!对C++进行深入的思考!!希望能帮到大家!!
C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++
C++深思录C++深思录C++深思录C++深思录C++深思录C++深思录C++深思录C++深思录C++深思录
设计模式C++学习之代理模式(Proxy)
该校友录设计全面,界面友好,适用于借鉴和直接利用,欢迎下载。
C++ PROXY 代理 dev-c++代码,命令行执行,简单明了
C++很精彩的错误集锦
备忘录模式 C++ 实现
c++沉思,非常经典呀