当前所在位置:珠峰网资料 >> 计算机 >> 计算机等级考试 >> 正文
计算机二级辅导:多维数组下标运算符重载
发布时间:2009/11/25 16:14:45 来源:城市学习网 编辑:admin

  遇到一道笔试题:设计一个矩阵类,行和列数通过构造函数输入,支持a[][]取值和赋值。
  这实际上就是一个二维数组下标运算符重载的问题,解决思路如下:
  (1)用一维数组代替二维数组分配内存,从而获得连续的内存空间,取值时通过计算获得相应行和列上的值
  (2)设计两个类,分别重载operator[],一个获取行,一个获取列
  实现如下:
  代码class MatrixEntry{
  friend class Matrix; //友元类,访问私有变量m_currentRow
  public:
  MatrixEntry(int m, int n) : m_row(m), m_col(n)
  {
  m_pMatrix = new int[m * n * sizeof(int)];
  }
  ~MatrixEntry()
  {
  delete m_pMatrix;
  }
  int & operator[](int col)
  {
  return m_pMatrix[m_currentRow * m_col + col];
  }
  private:
  int * m_pMatrix; //存储矩阵的一维数组
  int m_row;         //矩阵的行数
  int m_col;          //矩阵的列数
  int m_currentRow; //指示当前需要访问哪一行,该值由下面的Matrix类设置
  };
  class Matrix{
  public:
  Matrix(int m, int n) : m_entry(m, n)
  {
  }

  MatrixEntry & operator[](int row)
  {
  m_entry.m_currentRow = row;
  return m_entry;
  }
  private:
  MatrixEntry m_entry;
  };
  测试一下:
  测试代码
  int x = 1;
  int i;
  Matrix m(5, 5);
  for(i=0; i<5; i++)
  {
  for(int j=0; j<5; j++)
  {
  m[i][j] = x++;
  }
  }
  for(i=0; i<5; i++)
  {
  for(int j=0; j<5; j++)
  {
  cout << m[i][j] << endl;
  }
  }
  上面的实现只考虑了最基本的功能,没有涉及下标越界等错误处理逻辑,有兴趣的朋友可以补全。如果要设计一个泛型类,则把int替换为template<class T>中的T即可

广告合作:400-664-0084 全国热线:400-664-0084
Copyright 2010 - 2017 www.my8848.com 珠峰网 粤ICP备15066211号
珠峰网 版权所有 All Rights Reserved