博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
c++沉思录 学习笔记 第五章 代理类
阅读量:5289 次
发布时间:2019-06-14

本文共 2421 字,大约阅读时间需要 8 分钟。

Vehicle 一个车辆的虚基类

class Vehicle {

public:
virtual double weight()const = 0;
virtual void start() = 0;
virtual Vehicle* copy() = 0;
virtual ~Vehicle() {};
};

 

衍生出RoadVehicle AutoVehicle两个类

如果有一个停车场类 可以容纳100辆车

一开始计划 有Vehicle[100]这种变量来表示停车场

但是Vehicle是虚基类 不能有实例化的实体 也就不会有数组

所以需要一个代理类来保存Vehicle的指针 它可以指向任意的Vehicle的衍生类

同时考虑到拷贝操作 添加了拷贝函数

class VehicelSurrogate {

public:
VehicelSurrogate() :vp(0) {};
VehicelSurrogate( Vehicle& v) :vp(v.copy()) {};
VehicelSurrogate(const VehicelSurrogate& v):vp(v.vp ? v.vp->copy() : 0) {};
~VehicelSurrogate() {
delete vp;
};
VehicelSurrogate& operator=(const VehicelSurrogate& v) {
if (this != &v) {
delete vp;
vp = (v.vp ? v.vp->copy() : 0);
}
return *this;
};
double weight() {
return vp->weight();
}

private:

Vehicle* vp;
};

 

如此 就可以使用VehicelSurrogate[100]来表示停车场的概念

完整代码如下

1 // test5.cpp: 定义控制台应用程序的入口点。 2 // 3  4 #include "stdafx.h" 5 #include 
6 7 class Vehicle { 8 public: 9 virtual double weight()const = 0;10 virtual void start() = 0;11 virtual Vehicle* copy() = 0;12 virtual ~Vehicle() {};13 };14 15 class RoadVehicle:public Vehicle{16 public:17 virtual double weight() const{18 return 1;19 }20 virtual void start() {}21 virtual Vehicle* copy() {22 return new RoadVehicle(*this);23 }24 virtual ~RoadVehicle() {}25 };26 class AutoVehicle:public RoadVehicle{27 public:28 virtual double weight() const{29 return 2;30 }31 virtual void start() {}32 virtual Vehicle* copy() {33 return new AutoVehicle(*this);34 }35 virtual ~AutoVehicle() {}36 37 };38 39 40 class VehicelSurrogate {41 public:42 VehicelSurrogate() :vp(0) {};43 VehicelSurrogate( Vehicle& v) :vp(v.copy()) {};44 VehicelSurrogate(const VehicelSurrogate& v):vp(v.vp ? v.vp->copy() : 0) {};45 ~VehicelSurrogate() {46 delete vp;47 };48 VehicelSurrogate& operator=(const VehicelSurrogate& v) {49 if (this != &v) {50 delete vp;51 vp = (v.vp ? v.vp->copy() : 0);52 }53 return *this;54 };55 double weight() {56 return vp->weight();57 }58 59 private:60 Vehicle* vp;61 };62 63 64 int main()65 {66 VehicelSurrogate parking_lot[100];67 AutoVehicle x;68 parking_lot[0] = x;69 std::cout << parking_lot[0].weight() << std::endl;;70 return 0;71 }
View Code

 

转载于:https://www.cnblogs.com/itdef/p/7828570.html

你可能感兴趣的文章
常见软件版本号
查看>>
struts2框架之类型转换(参考第二天学习笔记)
查看>>
H5浏览器播放RTMP直播流实现切换
查看>>
JavaScript局部变量和全局变量的理解
查看>>
Maven的配置文件setting.xml
查看>>
有趣的机器学习:最简明入门指南
查看>>
HTTP协议详解(二)
查看>>
初学Socket
查看>>
由select引发的思考
查看>>
WCF 内置跟踪日志
查看>>
坐标旋转
查看>>
数字签名和数字证书
查看>>
iOS更改项目名称的详细步骤
查看>>
LeetCode Delete Node in a Linked List
查看>>
一个模仿CCTV 5+体育台上的选项卡
查看>>
Window Classes in Win32
查看>>
洛谷 P4071 [SDOI2016]排列计数
查看>>
AngularJS 教程
查看>>
小运算
查看>>
OpenCV学习笔记——视频的边缘检测
查看>>