zoukankan      html  css  js  c++  java
  • c++沉思录 学习笔记 第五章 代理类

    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 <iostream>
     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
    作 者: itdef
    欢迎转帖 请保持文本完整并注明出处
    技术博客 http://www.cnblogs.com/itdef/
    B站算法视频题解
    https://space.bilibili.com/18508846
    qq 151435887
    gitee https://gitee.com/def/
    欢迎c c++ 算法爱好者 windows驱动爱好者 服务器程序员沟通交流
    如果觉得不错,欢迎点赞,你的鼓励就是我的动力
    阿里打赏 微信打赏
  • 相关阅读:
    临时
    vue数据立刻绑定到dom元素
    java浅拷贝和深拷贝(基础也是很重要的)
    Eclipse快捷键大全
    微信小程序开发之路之组件化
    c++入门笔记
    开发个活动上线是个什么体验
    分布式锁的理解,java自带的锁为什么会失效
    vue页面开发遇到的坑,都是泪!src属性,freemarker取值
    java泛型理解。代码更明了。
  • 原文地址:https://www.cnblogs.com/itdef/p/7828570.html
Copyright © 2011-2022 走看看