此文记录《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++编程思想》是两部深受C++程序员喜爱的经典著作,它们深入浅出地探讨了C++语言的核心概念、设计模式以及编程实践。这两本书籍对于想要提升C++技能或者对面向对象编程有深度理解的人来说,是不可或...
《C++校友录程序》是一款基于C++编程语言开发的校友管理系统,旨在提供一个全面、易用的平台,便于用户管理、查询和交流校友信息。本文将深入探讨该程序的设计理念、主要功能以及核心技术,帮助读者理解并学习如何...
《Thinking in C++(第二版)》是一本专注于C++编程语言的经典教材,它的全面性和深度使得它成为想要深入学习C++的程序员的重要资源。本书不仅涵盖C++的基础知识,还包括了设计模式、标准模板库(STL)、异常处理等...
《C++沉思录》是一本深受欢迎的C++编程指南,它以其深入浅出的讲解方式和对C++核心概念的透彻分析而著称。这本书旨在帮助读者理解C++语言的内在机制,提升编程技能,从而更好地利用C++进行软件开发。以下是基于这个...
在这个"C++实现代理服务"的项目中,我们可以从提供的源代码文件中解析出以下几个关键知识点: 1. **C++编程基础**:C++是一种静态类型、编译式的面向对象编程语言,它扩展了C语言,增加了类、模板、异常处理等特性...
C++很精彩的错误集锦
win sockket全局代理驱动(c++ spi) 通过spi驱动实现在的全局代理模块,支持socks4,5,http代理协议。 同时支持ip filter功能, 可用于IE等浏览器。
本文将深入探讨C++实现的SIP代理服务器及其相关的知识点。 首先,让我们了解SIP代理服务器的基本功能。SIP代理服务器接收来自用户的SIP请求,然后根据请求的内容进行操作,如转发、路由、会话管理和计费等。它能够...
在linux平台下,涉及到unix套节字编程,用C/C++实现代理服务器,是基于TCP/IP和HTTP协议的编程
《C++深思录》是一本专注于探讨C++编程语言深度知识的书籍,其核心内容可能涵盖C++的高级特性、设计模式、程序优化、内存管理、模板元编程等多个方面。通过对C++深思录的学习,读者可以深入理解C++语言的底层机制,...
C\C++编程开发PDF[15本].rar C Primer Plus 5th C Primer_Plus C++ Primer Plus 6th ...C++ 沉思录 C++ 程序设计原理与实践 C++ 高级编程_本地没有找到 C++ 语言99个常见编程错误 C++ 语言的设计和演化
代理模式(Proxy) 定义: 为其他对象提供一种代理以控制对这个对象的访问 结构: 由三部分组成 1.RealSubject(真实对象): 真正会调用到的对象 2.Proxy(代理对象): 代理真实对象的地方 3.Subject(共同点): 代理对象...
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++实现代理模式,隐藏了真实的对象并且可以扩展其他的非核心功能,还实现了强制代理
《使用Visual C++编写的备忘录》 Visual C++是一种功能强大的集成开发环境,它由微软公司开发,主要用于创建Windows平台的应用程序。这个备忘录项目是利用Visual C++的强大功能来实现的一个实用工具,它能够帮助...
简易的校友录,运用了指针数组和类链表, void Add(node *&head, string na) { node *a, *p; a = new node; a->Name = na; if (head->next == NULL) { head->next = a; a->next = NULL; return;...
【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++ 的高级技术和框架。本阶段推荐的书籍...