遇到一道笔试题:设计一个矩阵类,行和列数通过构造函数输入,支持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
|