`
xkxjy
  • 浏览: 43530 次
  • 性别: Icon_minigender_1
  • 来自: 沈阳
社区版块
存档分类
最新评论

C++沉思录之代理

    博客分类:
  • C
阅读更多

此文记录《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++ 沉思录随书实例源代码

    《C++ 沉思录》是一本深受程序员喜爱的C++编程书籍,它深入探讨了C++语言的精髓和编程技巧。随书提供的实例源代码是理解和掌握书中的概念和实践的重要辅助材料。这些源代码涵盖了C++的基础到高级应用,旨在帮助读者...

    《C++沉思录》是一本由 Scoot Meyers 所著的经典 C++ 编程书籍 该书深入探讨了 C++ 的一些高级概念和技术

    ### 《C++沉思录》关键知识点解析 #### 一、深入理解 C++ 核心概念 **设计哲学与特性解析:** Scoot Meyers 在《C++沉思录》中对 C++ 语言的核心概念进行了深入的剖析。本书不仅介绍了 C++ 的基本语法,更重要的...

    C++沉思录~!学习C的必备书之一~

    《C++沉思录》是一本针对C++语言深入讲解的经典著作,被广泛认为是学习C++不可或缺的重要参考资料之一。虽然书名中提到了“学习C的必备书之一”,但实际上这本书主要是围绕C++语言进行阐述,旨在帮助读者更好地理解...

    C++沉思/C++编程思想

    《C++沉思》与《C++编程思想》是两部深受C++程序员喜爱的经典著作,它们深入浅出地探讨了C++语言的核心概念、设计模式以及编程实践。这两本书籍对于想要提升C++技能或者对面向对象编程有深度理解的人来说,是不可或...

    c++沉思录.pdf c++学习的必备数据,

    根据提供的信息,我们可以推断出该文档主要涉及的是C++编程语言的学习资料——《C++沉思录》。虽然给出的部分内容主要是关于版权、转载规定以及联系方式等,并没有直接涉及技术内容,但我们仍然可以根据文档标题、...

    c++沉思录 10年编程的真知灼见

    《C++沉思录》是一本面向有一定C++编程经验的开发者所编写的书籍,它凝聚了作者10年的编程智慧和实践经验。该书旨在帮助读者深入理解C++语言的本质,提升编程技巧,从而达到精通C++程序设计的水平。 在C++的世界里...

    《C++沉思录》--十年编程生涯的真知灼见

    《C++沉思录》--十年编程生涯的真知灼见

    C++沉思录,Andrew Koenig Barbara Moo著,黄晓春 译

    根据提供的信息,《C++沉思录》一书是由Andrew Koenig和Barbara Moo共同编著,由黄晓春翻译的。这本书对于深入理解和掌握C++语言有着非常重要的作用,被视为学习C++的一个优秀资源。 ### C++沉思录的核心知识点 ##...

    C++沉思录 trace

    #include &lt;stdio.h&gt;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++C++C++

    C++实现代理服务

    在这个"C++实现代理服务"的项目中,我们可以从提供的源代码文件中解析出以下几个关键知识点: 1. **C++编程基础**:C++是一种静态类型、编译式的面向对象编程语言,它扩展了C语言,增加了类、模板、异常处理等特性...

    c++ 本地代理服务器源码

    标题 "c++ 本地代理服务器源码" 暗示我们正在讨论一个使用C++编程语言编写的本地代理服务器的源代码。这个代理服务器可能是为了帮助用户通过它来访问网络,提供安全、缓存或者性能优化等服务。下面将详细探讨C++在...

    C++编写的校友录管理系统

    《C++实现的校友录管理系统详解》 C++是一种强大的面向对象编程语言,它以其高效、灵活和丰富的库支持在软件开发领域占据了重要的地位。在本篇中,我们将深入探讨一个基于C++编写的校友录管理系统,这是一个典型的...

    win sockket全局代理驱动(c++ spi)

    win sockket全局代理驱动(c++ spi) 通过spi驱动实现在的全局代理模块,支持socks4,5,http代理协议。 同时支持ip filter功能, 可用于IE等浏览器。

    sip代理服务器C++

    本文将深入探讨C++实现的SIP代理服务器及其相关的知识点。 首先,让我们了解SIP代理服务器的基本功能。SIP代理服务器接收来自用户的SIP请求,然后根据请求的内容进行操作,如转发、路由、会话管理和计费等。它能够...

    C++深思录 .

    《C++深思录》是一本专注于探讨C++编程语言深度知识的书籍,其核心内容可能涵盖C++的高级特性、设计模式、程序优化、内存管理、模板元编程等多个方面。通过对C++深思录的学习,读者可以深入理解C++语言的底层机制,...

    代理模式 C++实现

    代理模式(Proxy) 定义: 为其他对象提供一种代理以控制对这个对象的访问 结构: 由三部分组成 1.RealSubject(真实对象): 真正会调用到的对象 2.Proxy(代理对象): 代理真实对象的地方 3.Subject(共同点): 代理对象...

    C++从入门到精通(笔者收集的十几本C++相关教程)

    c++沉思录.pdf; Effective_STL.chm; effectiveC++.chm; Thinking in C++ 中文版.pdf; 标准C++输入输出流与本地化.pdf; 泛型编程与STL.pdf; 美河提供.STL.源码剖析.pdf; 高质量C++C编程指南.pdf; 计算机算法...

Global site tag (gtag.js) - Google Analytics