在使用二维数组时,我们可以使用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. Day01:API文档 / 字符串基本操作

    JDK API 什么是JDK API? JDK中包含大量的API类库,所谓AP就是一些写好的,可提供直接调用的功能(在Java语言中,这些功能以类的形式封装). JDK API包含的类库功能强大,经常 ...

  2. Linux 的简单命令以及在idea中配置码云

    Linux 的简单命令: ls(list)功能:列出目录内容 cd(change directory)功能:切换目录 touch 1.txt 在当前目录创建一个文件1.txt clear:清除屏幕 p ...

  3. HtML5与CSS3基础

    HTML标签 1.<a></a> 超链接标签 属性 href:跳转页面的连接 name:实现定锚功能,跳转同一页面不同位置(例返回顶部) target: (self, pare ...

  4. vue如何实现热更新

    我们都知道,对于node来说,前端vue代码的迭代节奏是很快的,可能一周要迭代几次,但是node的迭代却没那么平凡,可能一周更新一次甚至更久,那么为了node服务的稳定,减少node服务的发布次数,是 ...

  5. MySQL数据库的常见操作

    1.查看所有的数据库 1 show databases; 2.创建数据库  后面的时编码格式 1 create database dbName charset='utf8'; 3.使用/切换数据库 1 ...

  6. poj1011(DFS+剪枝)

    题目链接:https://vjudge.net/problem/POJ-1011 题意:给定n(<=64)条木棍的长度(<=50),将这些木棍刚好拼成长度一样的若干条木棍,求拼出的可能的最 ...

  7. JavaSE--面向对象

    面向对象(Object Oriented) 面向对象是一种思想,是基于面向过程而言的,就是说面向对象是将功能等通过对象来实现,将功能封装进对象之中,让对象去实现具体的细节:这种思想是将数据作为第一位, ...

  8. Quartz.net 3.x使用总结(一)——简单使用

    原文:Quartz.net 3.x使用总结(一)--简单使用 阅读目录 1.Quartz.net简介 2.简单使用 3.TriggerBuilder介绍 3.1  SimpleSchedule 3.2 ...

  9. C#实现Web链接启动应用程序

    C#实现Web链接启动应用程序 最近需要配合Web端实现用户点击链接来启动应用程序并且需要能够传参数给应用程序. 那么就可以使用注册表来实现这个功能 编写注册表可以在软件安装程序中加入,也可以在软件启 ...

  10. Redis【1】Linux下安装~

    先去Redis官网下载tar.gz文件.点击中间的[Check the downloads page.].再点击中间Stable 模块的[Download]下载 这把我做演示的文件是 redis-5. ...