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

原创 2006年06月08日 14:52:00

          在编程过程中可能要把不同的对象(这些对象可能存在一些关系:继承)放到一个容器里边,我们都知道一个基类的指针可以指向子类的一个实例,我们就在这里有用一个基类的指针使其指向不同的实例,并把这些指针放到一个容器内。我把这一章内的讲解的例子整理了一下,并通过了测试。测试的环境是(VS2003)

 class vehicle
{
public:
 virtual ~vehicle(void) {}
 virtual double weight(void) const = 0;
 virtual void start(void) = 0;
 virtual vehicle* copy(void) const = 0;
};//vehicle是一个抽象类,不可以实例化

class RoadVehicle : public vehicle
{
public:
 RoadVehicle(void) {}
 ~RoadVehicle(void) {}
 double weight(void) const { cout<<"RoadVehicle weight"<<endl; return 0; }
 void start(void) { cout<<"RoadVehicle start"<<endl; }
 vehicle* copy(void) const { return new RoadVehicle(*this); }
};

class AutoVehicle : public RoadVehicle
{
public:
 AutoVehicle(void) {}
 ~AutoVehicle(void) {}
 double weight(void) const { cout<<"AutoVehicle weight"<<endl; return 0;}
 void start(void) { cout<<"AutoVehicle start"<<endl; }
 vehicle* copy(void) const { return new AutoVehicle(*this); }
};

class AirCraft : public vehicle
{
public:
 AirCraft(void) {}
 ~AirCraft(void) {}
 double weight(void) const { cout<<"AirCraft weight"<<endl; return 0; }
 void start(void) { cout<<"AirCraft start"<<endl; }
 vehicle* copy(void) const { return new AirCraft(*this); }
};

class Helicopter : public AirCraft
{
public:
 Helicopter(void) {}
 ~Helicopter(void) {}
 double weight(void) const { cout<<"Helicopter weight"<<endl; return 0; }
 void start(void) { cout<<"Helicopter start"<<endl; }
 vehicle* copy(void) const { return new Helicopter(*this); }
};

///下面就是代理类了,通过这个类来访问不同对象的方法。

class VehicleSurrogate
{
public:
 VehicleSurrogate(void) : vp(0) {}
 VehicleSurrogate(const vehicle &v) : vp(v.copy()) {};//构造不同的实例,在程序的编译期间是不知道会是个什么样的对象
 ~VehicleSurrogate(void) { delete vp; }
 VehicleSurrogate(const VehicleSurrogate &v) : vp(v.vp ? v.vp->copy() : 0) { }
 VehicleSurrogate& operator=(const VehicleSurrogate &v)
 {
  if (this != &v)
  {
   delete vp;
   vp = (v.vp ? v.vp->copy() : 0);
  }
  return *this;
 }
 double weight(void)
 {
  if (vp == 0)
  {
   cout<<"weight vp is NULL"<<endl;
  }
  return vp->weight();
 }
 void start(void)
 {
  if (vp == 0)
  {
   cout<<"start vp is NULL"<<endl;
  }
  return vp->start();
 }
private:
 vehicle *vp;
};
int _tmain(int argc, _TCHAR* argv[])
{
 VehicleSurrogate parking_lot[2];
 Helicopter x;
 AirCraft y;
 parking_lot[0] = x;
 parking_lot[1] = y;
 parking_lot[0].weight();
 parking_lot[1].start();
 return 0;
}

Output:

Helicopter weight

AirCraft start

   在这个程序中,存储到容器中的对象都是原来对象的一个副本(即原对象的一个拷贝),一定要复制这些对象吗?答案是否定的,我们可以存储这些对象的句柄,使用句柄同样可以保持原来的对象的多态行为,却是我们减少了不必要的拷贝,何乐而不为呢?

 

 

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

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

c/c++成长之捷径 C/C++学习资料大全

socket协议 三次握手与结束连接 客户端代码: #include #include #include //for bzero #include //for socketa...
  • Windeal
  • Windeal
  • 2013年05月31日 23:05
  • 4438

c/c++成长之捷径

c/c++成长之捷径           c++成长之路不再迷茫!           不知不觉中进入计算机行业已有多个年头了,回首往事依然历历在目。今天我把我这段时间收集的书...
  • zhaodan19861107
  • zhaodan19861107
  • 2014年05月20日 11:20
  • 5352

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

所谓代理类,即surrogate.为什么要使用它呢,简单的举个例子. 1 class Vehicle 2 { 3 public: 4 Vehicle(){} 5 virtual ...
  • shuideyidi
  • shuideyidi
  • 2013年12月08日 15:18
  • 1145

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

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

ios开发--Objective-C 类属性

由于Swift 3.0 出了太多令人兴奋的新特性,人们很容易忽略 Objective-C中的小改动。苹果展示Objective-C 很可能是为了提高Swift互操作性(译者注:互操作性主要是指OC代码...
  • zzzzzdddddxxxxx
  • zzzzzdddddxxxxx
  • 2016年12月14日 09:37
  • 194

c/c++成长之捷径

c++成长之路不再迷茫!           不知不觉中进入计算机行业已有多个年头了,回首往事依然历历在目。今天我把我这段时间收集的书籍资料以及实例源码帖出来(部分资料太大了放不上去,理解下),...
  • Baoge_leopard
  • Baoge_leopard
  • 2014年10月15日 21:03
  • 2794

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
  • 570
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:《C++沉思录》第五章---代理类
举报原因:
原因补充:

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