经过一番研究及测试,通过.需要的朋友可以参考.有以下特点:

  • 完整重载了各必要操作符。
  • 区分不同的类型,进行初始化。
  • 为了验证,特别增加了测试代码。
  • 可以支持多维操作.

  完整代码如下:

  • 头文件
#ifndef __GH_SAFE_ARRAY_H__
#define __GH_SAFE_ARRAY_H__/*** 如何解决memcpy/memset之类的问题?* 二维多维数组怎么支持?*/
template <class TYPE>
class SafeArray
{
public:SafeArray();SafeArray(const int size);SafeArray(const int size, const char* pFile, const char* pFunction, const int nLine);~SafeArray();void  init(const int size);void  init(const int size, const char* pFile, const char* pFunction, const int nLine);int   getSize();int   getCurrentOffset();bool  isStart();bool  isEnd();void  resetOffset();TYPE& operator[](const int i);SafeArray<TYPE>& operator+(const int i);SafeArray<TYPE>& operator-(const int i);TYPE* operator++(const int i);TYPE* operator--(const int i);TYPE* operator+=(const int i);TYPE* operator-=(const int i);//memcpy//memset//copy//cloneprivate:TYPE* m_pData;int   m_nSize;int   m_nCurrent;char* m_pFile;char* m_pFunction;int   m_nLine;
};#endif
  • 实现文件

/**
在C++面向对象程序设计中,有时候需要判断某个对象的类类型,那么可以有下列两种方法:
方法1:采用 typeid()函数进行判断:(缺点:当存在继承,并且子类指针赋值给父类指针时,此时判断的对象类型为父类型,而不是子类类型)
方法2:定义虚函数返回类类型
在运行时类型识别,最简单的办法就是所有的类(父类和子类)实现一个虚方法返回类名字,根据返回类名字再利用typeid()进行判断。如:*/template <typename T>
void test(T temp)
{//cout<<temp<<endl;
}//判断两个类型是否一样
template<typename T1, typename T2>
struct is_same_type
{operator bool(){return false;}
};template<typename T1>
struct is_same_type<T1, T1>
{operator bool(){return true;}
};template <typename T> struct is_type_char\{    operator bool()    {    return false;   }};
template <>           struct is_type_char<char>\{    operator bool()    {    return true;    }};
template <typename T> struct is_type_int\{    operator bool()    {    return false;   }};
template <>           struct is_type_int<int>\{    operator bool()    {    return true;    }};template <typename T> struct is_base_type
{operator bool(){return    is_type_char<T>()|| is_type_int <T>();}
};template <class TYPE>
SafeArray<TYPE>::SafeArray()
{init(0, __FILE__, __FUNCTION__, __LINE__);
}template <class TYPE>
SafeArray<TYPE>::SafeArray(const int size)
{//new (this) SafeArray::SafeArray<TYPE>(m_nSize, __FILE__, __FUNCTION__, __LINE__);init(size, __FILE__, __FUNCTION__, __LINE__);
}template <class TYPE>
SafeArray<TYPE>::SafeArray(const int size, const char* pFile, const char* pFunction, const int nLine)
{init(size, pFile, pFunction, nLine);
}template <class TYPE>
void  SafeArray<TYPE>::init(const int size)
{init(size, __FILE__, __FUNCTION__, __LINE__);
}template <class TYPE>
void  SafeArray<TYPE>::init(const int size, const char* pFile, const char* pFunction, const int nLine)
{m_nSize = size;m_pData = new TYPE[m_nSize];m_nCurrent = 0;if (is_base_type<TYPE>()){memset(m_pData, 0, sizeof(TYPE)*m_nSize);}this->m_pFile     = (char*)pFile;this->m_pFunction = (char*)pFunction;this->m_nLine     = nLine;//gh_memory_increase(this, m_pFile, m_pFunction, m_nLine, size);
}template <class TYPE>
SafeArray<TYPE>::~SafeArray()
{if (m_pData != NULL){delete[] (m_pData);m_pData = NULL;m_nSize = 0;}//gh_memory_decrease(this, m_pFile, m_pFunction, m_nLine);
}template <class TYPE>
bool  SafeArray<TYPE>::isStart()
{return (m_nCurrent == 0);
}template <class TYPE>
bool  SafeArray<TYPE>::isEnd()
{return (m_nCurrent+1 == m_nSize);
}template <class TYPE>
int   SafeArray<TYPE>::getSize()
{return m_nSize;
}template <class TYPE>
int   SafeArray<TYPE>::getCurrentOffset()
{return m_nCurrent;
}template <class TYPE>
void  SafeArray<TYPE>::resetOffset()
{m_nCurrent = 0;
}template <class TYPE>
TYPE& SafeArray<TYPE>::operator[](const int i)
{int pos = (m_nCurrent+i);if (pos >= m_nSize ){GH_LOG_ERROR("Out of Array Range! %d+%d > %d", m_nCurrent, i, m_nSize);// 返回第一个元素return m_pData[0];}return m_pData[pos];
}template <class TYPE>
SafeArray<TYPE>& SafeArray<TYPE>::operator+(const int i)
{m_nCurrent += i;if (m_nCurrent + i >= m_nSize){GH_LOG_ERROR("Out of Array Range! %d+%d > %d", (m_nCurrent-i), i, m_nSize);m_nCurrent = 0;}return (*this);
}template <class TYPE>
SafeArray<TYPE>& SafeArray<TYPE>::operator-(const int i)
{m_nCurrent -= i;if (m_nCurrent < 0){GH_LOG_ERROR("Out of Array Range! %d-%d < 0", (m_nCurrent+i), i);m_nCurrent = 0;}return (*this);
}template <class TYPE>
TYPE* SafeArray<TYPE>::operator ++ (const int i)
{m_nCurrent ++;if (m_nCurrent >= m_nSize){GH_LOG_ERROR("Out of Array Range! %d++ >= %d", (m_nCurrent-1), m_nSize);m_nCurrent = 0;return m_pData;}return m_pData+m_nCurrent;
}template <class TYPE>
TYPE* SafeArray<TYPE>::operator -- (const int i)
{m_nCurrent --;if (m_nCurrent < 0){GH_LOG_ERROR("Out of Array Range! %d-1 < 0", (m_nCurrent+1));m_nCurrent = 0;return m_pData;}return m_pData+m_nCurrent;
}template <class TYPE>
TYPE* SafeArray<TYPE>::operator+=(const int i)
{m_nCurrent += i;if (m_nCurrent >= m_nSize){GH_LOG_ERROR("Out of Array Range! %d+%d > %d", (m_nCurrent-i), i, m_nSize);m_nCurrent = 0;return m_pData;}return m_pData+m_nCurrent;
}template <class TYPE>
TYPE* SafeArray<TYPE>::operator-=(const int i)
{m_nCurrent -= i;if (m_nCurrent < 0){GH_LOG_ERROR("Out of Array Range! %d+%d < 0", (m_nCurrent+i), i);m_nCurrent = 0;return m_pData;}return m_pData+m_nCurrent;
}#if 1
void testFor1d(SafeArray<int>& test1d)
{test1d.resetOffset();test1d ++;printf("++   %2d\n", test1d[0]);test1d --;printf("--   %2d\n", test1d[0]);test1d += 16;printf("+=16 %2d\n", test1d[0]);test1d -= 16;printf("-=16 %2d\n", test1d[0]);test1d = test1d + 10;printf(" +10 %2d\n", test1d[0]);test1d = test1d - 10;printf(" -10 %2d\n", test1d[0]);
}int main(int argc, char** argv)
{
#if 0//OKSafeArray<int> test1d(32);for (int i=0; i<test1d.getSize(); i++){test1d[i] = i;}testFor1d(test1d);
#endif#if 0//OKSafeArray<SafeArray<int>> test2d(32);for (int i=0; i<test2d.getSize(); i++){//显式初始化test2d[i].init(32);for (int j=0; j<test2d[i].getSize(); j++){test2d[i][j] = i*100 + j;}testFor1d(test2d[i]);}
#endif#if 1//OKSafeArray<SafeArray<int>*> test2d2(32);for (int i=0; i<test2d2.getSize(); i++){//显式新建test2d2[i] = new SafeArray<int>(32);for (int j=0; j<test2d2[i]->getSize(); j++){(*test2d2[i])[j] = i*100 + j;}testFor1d(*test2d2[i]);}
#endif}
#endif

C++模板实现,支持多维,安全数组的完整代码相关推荐

  1. JavaScript - 根据指定下标删除数组中的元素(支持二维对象数组)

    前言 网上的大部分方法及原生 splice 都存在一定的问题,本文做一个函数封装,传入数组及下标即可自动完成移除. 很多时候,我们需要移除指定下标的数组元素, 例如我有一个数组 ['A', 'B'] ...

  2. Python(numpy):垂向涡度计算(二维速度,附完整代码)

    最近写代码的时候遇到了需要用速度计算涡度的问题,在网上搜了一下,发现不知道为什么,能找到的代码源都无比复杂,难道是简单到大家都不屑于写了吗hhh 涉及到处理数据,如果你的数据来源是nc文件,并使用xa ...

  3. c语言学习-从键盘输入10个字符,按照字典顺序将其排序输出(二维字符数组)

    从键盘输入10个字符,按照字典顺序将其排序输出(二维字符数组) 程序流程图: 代码: #include<stdio.h> void main() {int b[10]; int a[5][ ...

  4. SegeX SgxVariantArrayT:VC封装支持多维数组的变体类型(VRIANT 、SafeArray)(附免费免积分源代码)

    ----哆啦刘小洋 原创,转载需说明出处 2023-01-04 SgxVariantArrayT:支持多维数组的变体类型 1 简介 2 方法原理 2.1 继承于_variant_t 2.2 模板类型到 ...

  5. 根据数组中的某个键值大小进行排序,仅支持二维数组

    /**     * 根据数组中的某个键值大小进行排序,仅支持二维数组     *     * @param array $array 排序数组     * @param string $key 键值 ...

  6. C++中使用模板,new创建2维动态数组

    1 // 使用模板和new创建2维动态数组 2 3 #include<iostream> 4 #include<exception> 5 #include<cstdlib ...

  7. Matlab常见报错:错误使用 conv2不支持 N 维数组;cell类型数组不支持运算符

    一.错误使用 conv2不支持 N 维数组: 错误样例: 原因:提示错误使用 conv2不支持 N 维数组,可能是因为你读取的图像并不是灰度图像,而是RGB图像,有red/green/blue三种颜色 ...

  8. python读取文件中的数据为二维数组变量_Numpy 多维数据数组的实现

    numpy包(模块)几乎总是用于Python中的数值计算.这个软件包为Python提供了高性能的向量.矩阵.张量数据类型.它是在C和Fortran中创建的,因此当计算被矢量化(用矩阵和矢量表示操作)时 ...

  9. 【C 语言】指针 与 数组 ( 指针 | 数组 | 指针运算 | 数组访问方式 | 字符串 | 指针数组 | 数组指针 | 多维数组 | 多维指针 | 数组参数 | 函数指针 | 复杂指针解读)

    相关文章链接 : 1.[嵌入式开发]C语言 指针数组 多维数组 2.[嵌入式开发]C语言 命令行参数 函数指针 gdb调试 3.[嵌入式开发]C语言 结构体相关 的 函数 指针 数组 4.[嵌入式开发 ...

  10. python赋值的数组无序怎么办_Python的多维空数组赋值方法

    Python里面的list.tuple默认都是一维的. 创建二维数组或者多维数组也是比较简单. 可以这样: list1 = [1,2,] list1.append([3,4,]) 可以这样: list ...

最新文章

  1. 制作 Swift 和 Objective-C Mixed 的 Pod
  2. 最大权值闭合子图的证明详解
  3. 这位院士,获一次性奖励2500万!
  4. [转]sqlserver 数据类型 及使用考虑
  5. IBM 推出 Bluemix :Swift 将支持服务器端开发
  6. java des验证码,Servlet返回验证码
  7. CH - 0104 起床困难综合症(位运算+贪心)
  8. 深入理解MySQL底层架构,看这一篇文章就够了!
  9. 用自定义函数联合IF函数实现“一对多”查询
  10. 分布式事务控制解决方案
  11. HighCharts:为plotLines基准线添加label标签不显示
  12. win10系统迁移到固态(傻瓜式--分区助手)
  13. 微信网页开发调试的一些方法
  14. 变量覆盖(超详细!)
  15. Android lua编辑工具,Lua脚本编辑器
  16. 老无所依nbsp;(聊后版)
  17. XMind使用教程入门
  18. 调用第三方应用App
  19. 背景图全屏水平垂直居中的方法
  20. 中科大+快手出品 CIRS: Bursting Filter Bubbles by Counterfactual Interactive Recommender System 代码解析

热门文章

  1. er图一对多的关系怎么体现_抠图高级技法之混合剪切篇
  2. 提现php防刷,PHP简单的防刷计数器–已经图片化
  3. git log和reflog
  4. php PHP-FPM进程数的设定
  5. tp3.2 开发规范(命名规范)
  6. easyexcell导出专题
  7. 报表的查询条件只能在数据上方吗?
  8. 嵌入式Linux截图工具gsnap移植与分析【转】
  9. Win8.1下COCOS2D-X 3.4环境搭建
  10. CentOS6.6下搭建vsftpd+PAM认证