在使用二维数组时,我们可以使用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(代理类)的更多相关文章

  1. 探索Mybatis之JDK动态代理:探究Proxy.newProxyInstance()生成的代理类解析

    Mybatis的Mapper接口UserMapper 1 package com.safin.Mapper; 2 3 import com.safin.Pojo.User; 4 5 import ja ...

  2. Proxy 动态代理 InvocationHandler CGLIB MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  3. 代理类和AOP

    客户端不用调用目标对象了,直接调用代理类.最终目标方法还是去实行了. 代理类的每个方法调用目标类的相同方法,并且在调用方法时候加上系统功能的代码 代理和目标实现了相同的接口,有相同的方法.通过接口进行 ...

  4. proxy代理类

    package cn.hncu.proxy.rent; import java.lang.reflect.InvocationHandler;import java.lang.reflect.Meth ...

  5. 深入解析OpenCart的代理类proxy

    1.什么是代理类 代理类指的是连接远程对象或不可见对象的接口,通常被客户端调用来连接真实的服务对象.更准确的定义参见维基百科 2.代理的作用 作为一个包装类,提供额外的功能 延迟加载 在本文讲到的op ...

  6. Java代理类Proxy的用法

    代理(proxy) 利用代理可以在运行时创建一个实现了一组给定接口的新类.这种功能只有在编译时无法确定需要实现哪个接口时才有必要使用. 何时使用代理 假设有一个表示接口的Class对象(有可能只包含一 ...

  7. 面试官:你说你懂动态代理,那你知道为什么JDK中的代理类都要继承Proxy吗?

    之前我已经写过了关于动态代理的两篇文章,本来以为这块应该没啥问题,没想到今天又被难住了- 太难了!!! 之前文章的链接: 动态代理学习(一)自己动手模拟JDK动态代理. 动态代理学习(二)JDK动态代 ...

  8. Struts2 源码分析——Action代理类的工作

    章节简言 上一章笔者讲到关于如何加载配置文件里面的package元素节点信息.相信读者到这里心里面对struts2在启动的时候加载相关的信息有了一定的了解和认识.而本章将讲到关于struts2启动成功 ...

  9. 解析利用wsdl.exe生成webservice代理类的详解

    利用wsdl.exe生成webservice代理类:根据提供的wsdl生成webservice代理类1.开始->程序->Visual Studio 2005 命令提示2.输入如下红色标记部 ...

随机推荐

  1. 【ABAP系列】SAP ABAP获取域(domain)值的方法

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[ABAP系列]SAP ABAP获取域(doma ...

  2. POJ3585 Accumulation Degree【换根dp】

    题目传送门 题意 给出一棵树,树上的边都有容量,在树上任意选一个点作为根,使得往外流(到叶节点,叶节点可以接受无限多的流量)的流量最大. 分析 首先,还是从1号点工具人开始$dfs$,可以求出$dp[ ...

  3. 20191209 【归档】Linux就该这么学

    学习背景 因为打算学习Redis和Docker,但是发现对Linux的操作已经完全忘记了,所以选择再学一次,但是不会深入的学习,选择了<Linux就该这么学>这本书,学完了感觉还挺好,但是 ...

  4. Leetcode 38.报数 By Python

    报数序列是一个整数序列,按照其中的整数的顺序进行报数,得到下一个数.其前五项如下: 1. 1 2. 11 3. 21 4. 1211 5. 111221 1 被读作 "one 1" ...

  5. (4.13)mysql备份原理(转)

    关键词:mysqldump原理,--single-transaction,mysql备份原理 转自:https://www.cnblogs.com/cchust/p/5452557.html MySQ ...

  6. [转帖]Marvell第二代ARM处理器ThunderX2解析

    Marvell第二代ARM处理器ThunderX2解析 https://www.cnbeta.com/articles/tech/853137.htm 长久以来,服务器数据中心市场一直被x86 CPU ...

  7. 存储过程实例基于postgersql

    数据库用的是postgersql 数据库管理工具是DBeaver  mybatis操作数据库基于jdbcTemplate 1.写的存储方法放在数据库下面的Procedures目录下 function ...

  8. 洛谷 P1508 Likecloud 题解

    题面 很简单的一个二维DP f[i][j]表示最后吃到(i,j)所能获得的最大值, 那么f[i][j]=max(f[i+1][j-1],f[i+1][j],f[i+1][j+1])+a[i][j]; ...

  9. Exchange 2010 详细安装步骤

    工具/原料   系统要求:windows 2008 R2 标准版或者企业版 Exchange Server 2010 SP3:https://www.microsoft.com/en-us/downl ...

  10. thinkphp5 安装

    thinkphp 5开始可以使用composer安装 所以在安装thinkphp5.1之前,我们先安装composer ,下载地址:https://www.phpcomposer.com/ 安装完co ...