C++沉思录读书笔记(一)代理类

原创 2004年07月06日 12:24:00

C++沉思录读书笔记(一)代理类

代理类的每一个对象都代表另一个对象,该对象可以是位于一个完整继承层次中的任何类的对象。通过在容器中用代理类而不是对象本身可以解决控制内存分配和把不同类型的对象放在同一个容器中这两个问题

********
问题
********
抽象基类Vehicle包含成员
double weight() const
void start()

以下4个类从Vehicle派生,每个类另有自己的独特的成员,比如Aircraft包含成员 void fly()
RoadVehicle
AutoVehicle
Aircraft
Helicopter

设计一个C++容器,它有能力包含类型不同而彼此相关的对象

将整个派生层次压缩在一个对象类型中


********
解决方案
********
@方案1:数组存储基类对象
Vehicle parking_lot[1000];
@潜在问题:
1. 抽象基类无法实例化
2. 即使基类不是抽象类,存储派生类对象也会造成对象被剪裁

@方案2:数组存储基类指针
Vehicle* parking_lot[1000];
@潜在问题:
1. 存储的对象都有各自的生存期

@方案3:数组存储指向对象副本的指针
对象副本的生存期由数组决定,释放数组时也释放其中指向的全部对象
@潜在问题:
带来动态内存管理的负担
放入数组的对象只能是静态类型,如果想让parking_lot[p]指向一个新建的对象,这个对象的实际类型和parking_lot[q]指向的对象相同,则无法创建出这个对象(不使用RTTI)

@方案4:数组存储指向对象副本的指针,为派生层次添加虚复制函数
Virtual Vehicle* copy() const = 0; //基类
Vehicle* Aircraft::copy() const //派生类
{
   return new Aircraft(*this);
}
还必须为派生层次添加虚析构函数
@潜在问题:
显式处理内存分配

@方案5:代理类
定义一个行为和Vehicle对象相似,又潜在的表示所有继承自Vehicle类的对象

class VehicleSurrogate {
public:
   VehicleSurrogate(); //可以创建VehicleSurrogate对象的数组
   VehicleSurrogate(const Vehicle&); //由任意继承自Vehicle的对象创建代理
   ~Vehiclesurrogate();
   VehicleSurrogate(const VehicleSurrogate&);
   VehicleSurrogate& operator= (const VehicleSurrogate&);

private:
   Vehicle* vp;

public: //来自Vehicle的操作
   double weight() const;
   void start();
}

VehicleSurrogate::VehicleSurrogate():vp(0) {} //可以生成空代理(empty surrogate)
VehicleSurrogate::VehicleSurrogate(const Vehicle& v):vp(v.copy()) {}
VehicleSurrogate::~VehicleSurrogate() { delete vp; }
VehicleSurrogate::VehicleSurrogate(const VehicleSurrogate&v):vp( v.vp?v.vp->copy():0 ) {}
VehicleSurrogate&
VehicleSurrogate::operator=(const VehicleSurrogate& v)
{
   if (this != &v) { //防止将代理复制给自身
      delete vp;
      vp = (v.vp?v.vp->copy():0);
   }
   return *this;
}

//来自Vehicle的操作
double VehicleSurrogate::weight() const
{
   if(0 == vp)
   throw "empty VehicleSurrogate.weight()";
   return vp->weight();
}
void VehicleSurrogate::start()
{
   if(0 == vp)
   throw "empty VehicleSurrogate.start()";
   vp->start();
}

*空代理:行为类似于零指针,可以创建、销毁和复制这样的代理,但是其他操作被视为出错


 使用代理类
 VehicleSurrogate parking_lot[1000];
 Aircraft x;
 parking_lot[0] = x;

《C++沉思录》读书笔记之代理类

#include #include int main() { int i; for( i=0;i
  • KangRoger
  • KangRoger
  • 2014年06月11日 21:00
  • 1133

《C++沉思录》第五章---代理类

          在编程过程中可能要把不同的对象(这些对象可能存在一些关系:继承)放到一个容器里边,我们都知道一个基类的指针可以指向子类的一个实例,我们就在这里有用一个基类的指针使其指向不同的实例,...
  • wei801004
  • wei801004
  • 2006年06月08日 14:52
  • 1413

《软件开发沉思录》读书笔记

1、  业务软件的最后一英里 l  何为最后一英里问题:简单-复杂-不堪重负-采用新系统来替换?风险?(替换的风险,不替换的风险,二难境地) l  敏捷思潮的一大贡献,是对于软件开发作为社会行为的...
  • zhang_qxian
  • zhang_qxian
  • 2017年01月04日 08:55
  • 299

读书笔记∣概率论沉思录 01

读书笔记:概率论沉思录
  • zhaozhn5
  • zhaozhn5
  • 2017年09月09日 21:09
  • 315

《C++沉思录》读书笔记【一】:代理类

C++代理类是为了解决这样的问题: 容器通常只能包含一种类型的对象,所以很难在容器中存储对象本身。怎样设计一个c++容器,使它有能力包含类型不同而彼此相关的对象? 代理运行起来和他所代表的对象基本相同...
  • BeyondHaven
  • BeyondHaven
  • 2011年06月21日 09:31
  • 987

C++ 沉思录》阅读笔记——类的反思

类这个概念无非是数据和方法的集合,为什么我一直困惑呢?为什么不弄清楚呢? C++中的类这个概念里有4个函数比较特殊,像我这种以前有C经验的人可能一时难以适应,它们是构造函数、析构函数、复制构造函...
  • flora_yao
  • flora_yao
  • 2015年07月02日 18:02
  • 632

C++ 沉思录 ,代理类

#include using namespace std; class Vehicel { public:     virtual double weight() const = 0; ...
  • wangkaiblog
  • wangkaiblog
  • 2014年06月25日 16:02
  • 368

C++沉思录代理类

前几天看的时候没看明白书里头说的对copy的调用都是虚调用的意思。我还理解成虚调用就相当于啥都没干,然后就百思不得其解了。难道是因为翻译的问题,可惜木有英文版,本来对照着看看 今天跑了下代码,其实就...
  • zhanglei0107
  • zhanglei0107
  • 2012年05月25日 22:34
  • 454

代理类(C++沉思录)

http://hi.baidu.com/cndx100/blog/item/e009cd46e3a9650f6a63e5e4.htmlhttp://hi.baidu.com/gylxue/blog/i...
  • wangyangkobe
  • wangyangkobe
  • 2011年03月11日 21:39
  • 569

C++沉思录读书笔记(5章)-代理类

问题描述:如何设计一个容器,能使得它能包含类型不同但是彼此相关的对象? 问题描述:如何复制编译时类型未知的对象? 解决方案一:使用容器存储指向对象的指针,通过继承来处理类型不同的对象。 ...
  • yucan1001
  • yucan1001
  • 2011年10月26日 10:43
  • 713
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C++沉思录读书笔记(一)代理类
举报原因:
原因补充:

(最多只允许输入30个字)