Proxy Class(代理类)
在使用二维数组时,我们可以使用a[][]来访问数组中的元素,这很显然是正确的也无需证明。
但如果要自己实现一个二维数组的时候,会发现如果想要重载符号[][],会被告知没有这个符号,这即引出了C++ oop设计方式中的一种proxy class方式。
proxy class即在一个class中,嵌套的声明了另一个class,利用了这个隐藏的嵌套class以实现一些特殊技巧。
回到二维数组中来,我们已知没有[][]这种链式访问结构的符号,但是C++又允许我们这样做,显然它实现时有某种技巧。
把二维数组拆分来看,其中我们知道,a[posi]是合法的,而我们常用的是a[posi1][posi2],把前半段拆开来看就是
( a[posi1] ) [posi2]
也就是说并没有什么二维数组,实际上是两个一维数组,其中第一个一维数组中保存了一些一维数组对象,内部的一维数组中保存了一个数
对应关系即:a[posi] –> _array(一个隐藏的对象) –> _array[posi2] 保存了一个值
以下是一个简略的代码实现(有BUG,见后方)
- template<typename T>
- class Array2D
- {
- private:
- //the proxy class
- class Array1D
- {
- private:int _cap = ;
- T* _elemNum = new T[_cap];
- public:
- Array1D(int inx)
- {
- _elemNum = new T[inx];
- }
- T& operator [](int posi)
- {
- return _elemNum[posi];
- }
- const T& operator [](const int posi) const
- {
- return _elemNum[posi];
- }
- };
- const int _cap = ;
- Array1D* _elemArray = new Array1D[_cap];
- public:
- Array2D(int inx1, int inx2)
- {
- Array1D* _elemArray = new Array1D[inx1];
- for (int i = ; i < inx1; i++)
- {
- Array1D* _tmpArray = new Array1D[inx2];
- _elemArray[i] = *_tmpArray;
- }
- }
- Array1D& operator [](int posi)
- {
- return _elemArray[posi];
- }
- };
区分两种数组:_elemArray用于储存匿名的函数对象,_elemNum用于储存实际的值。
proxy class在此处的实际意义就在于,其实现只在另一个class内使用,也只提供给他使用,类似于class的一个代理一样,负责处理内部事务。
注意其中Array2D的重载[]函数:
- Array1D& operator [](int posi)
- {
- return _elemArray[posi];
- }
返回的是一个Array1D对象的引用,那么实际调用时:
a[inx1][inx2] = …; a[inx1]部分返回了一个Array1D对象,为了方便现假定其名称为_array 故有:
a[inx1][inx2] –> _array[inx2]
同时这里还需要引出一个BUG,当这段代码实际运行的时候会提示:Array1D没有合适的默认构造函数可用,解决办法是给Array1D类一个没有参数的构造函数,即使它什么也不写也可以,具体原因请参见:https://www.cnblogs.com/HotPants/p/11421065.html
Proxy Class(代理类)的更多相关文章
- 探索Mybatis之JDK动态代理:探究Proxy.newProxyInstance()生成的代理类解析
Mybatis的Mapper接口UserMapper 1 package com.safin.Mapper; 2 3 import com.safin.Pojo.User; 4 5 import ja ...
- Proxy 动态代理 InvocationHandler CGLIB MD
Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...
- 代理类和AOP
客户端不用调用目标对象了,直接调用代理类.最终目标方法还是去实行了. 代理类的每个方法调用目标类的相同方法,并且在调用方法时候加上系统功能的代码 代理和目标实现了相同的接口,有相同的方法.通过接口进行 ...
- proxy代理类
package cn.hncu.proxy.rent; import java.lang.reflect.InvocationHandler;import java.lang.reflect.Meth ...
- 深入解析OpenCart的代理类proxy
1.什么是代理类 代理类指的是连接远程对象或不可见对象的接口,通常被客户端调用来连接真实的服务对象.更准确的定义参见维基百科 2.代理的作用 作为一个包装类,提供额外的功能 延迟加载 在本文讲到的op ...
- Java代理类Proxy的用法
代理(proxy) 利用代理可以在运行时创建一个实现了一组给定接口的新类.这种功能只有在编译时无法确定需要实现哪个接口时才有必要使用. 何时使用代理 假设有一个表示接口的Class对象(有可能只包含一 ...
- 面试官:你说你懂动态代理,那你知道为什么JDK中的代理类都要继承Proxy吗?
之前我已经写过了关于动态代理的两篇文章,本来以为这块应该没啥问题,没想到今天又被难住了- 太难了!!! 之前文章的链接: 动态代理学习(一)自己动手模拟JDK动态代理. 动态代理学习(二)JDK动态代 ...
- Struts2 源码分析——Action代理类的工作
章节简言 上一章笔者讲到关于如何加载配置文件里面的package元素节点信息.相信读者到这里心里面对struts2在启动的时候加载相关的信息有了一定的了解和认识.而本章将讲到关于struts2启动成功 ...
- 解析利用wsdl.exe生成webservice代理类的详解
利用wsdl.exe生成webservice代理类:根据提供的wsdl生成webservice代理类1.开始->程序->Visual Studio 2005 命令提示2.输入如下红色标记部 ...
随机推荐
- Python学习之进程
8.2 进程 8.2.1 进程的创建 开启多进程scoketserver:server.client 进程的开启:python中的多线程,一定是有一个主进程,由主进程创建几个子进程, Linux与Wi ...
- LeetCode.961-2N数组中N次重复的元素(N-Repeated Element in Size 2N Array)
这是悦乐书的第365次更新,第393篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第227题(顺位题号是961).在大小为2N的数组A中,存在N+1个唯一元素,并且这些元 ...
- lua基础学习(三)
一.lua函数 1.在Lua中,函数是对语句和表达式进行抽象的主要方法.既可以用来处理一些特殊的工作,也可以用来计算一些值.Lua 提供了许多的内建函数,你可以很方便的在程序中调用它们,如print( ...
- Oracle常用启停命令
一.监听启停 Oracle监听的启动.停止和状态查看 Oracle监听启动: lsnrctl start Oracle监听停止: lsnrctl stop Oracle监听状态 lsnrctl sta ...
- 一台 Java 服务器可以跑多少个线程?
一台Java服务器能跑多少个线程? 这个问题来自一次线上报警如下图,超过了我们的配置阈值. 京东自研UMP监控分析 打出jstack文件,通过IBM Thread and Monitor Dump A ...
- RabbitMQ入门教程(二):简介和基本概念
原文:RabbitMQ入门教程(二):简介和基本概念 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn ...
- 深入Spring Boot:那些注入不了的 Spring 占位符 ( ${} 表达式 )
Spring里的占位符 spring里的占位符通常表现的形式是: 1 2 3 <bean id="dataSource" destroy-method="close ...
- Echarts-数据的视觉映射
来源:官网,自己整理 数据可视化是 数据 到 视觉元素 的映射过程(这个过程也可称为视觉编码,视觉元素也可称为视觉通道). ECharts 的每种图表本身就内置了这种映射过程,比如折线图把数据映射到『 ...
- 2019-11-29-Roslyn-如何在-Target-引用-xaml-防止文件没有编译
title author date CreateTime categories Roslyn 如何在 Target 引用 xaml 防止文件没有编译 lindexi 2019-11-29 08:58: ...
- spring之bean的自动扫描
首先看一段applicationContext.xml中的自动扫描配置 <context:component-scan base-package="org.java.test" ...