类设计--二维数组

6 篇文章 0 订阅
4 篇文章 0 订阅
重载运算符 [][]

在一维数组的基础上重新设计二维数组类

利用C++的template参数的嵌套性
Array< Array <double> > a(3)
1.重新加入了个rsize,判断二维数组是否超。
#include <iostream>
using namespace std;
template <class T>
class Array
{
private:
    T *arr;
    int arrsize;
public:
    Array(int asize=100):arrsize(asize){arr=new T[asize];}
    ~Array(){delete []arr;}
    T& operator[](int ind);
    operator T*() {return arr;}
	void resize(int rsize);
};
template <class T>
T& Array<T>::operator[](int ind)
{
    static T t;
    if (ind<arrsize&&ind>=0)
        return arr[ind];
    else
    {
        cout<<"下标出界:("<<ind<<")";
        return t;
    }
}
template <class T>
void Array<T>::resize(int rsize){
	if (rsize<0||rsize==arrsize)
		return ;
	T *newarr=new T[rsize];
	int n=(rsize<arrsize)?rsize:arrsize;
	for(int i=0;i<n;i++)
		newarr[i]=arr[i]; //保存原数组值
	delete []arr;
	arr = newarr;
	arrsize = rsize;
}
int main()
{
    Array<Array <double> > a(3);
    int i,j;
	a[0].resize(2);
	a[1].resize(2);
	a[2].resize(2);
    for(i=0;i<3;i++)
        for(j=0;j<2;j++)
            a[i][j] = 10*i+j;
	cout<<a[1][1]<<endl;
	cout<<a[1][3]<<endl;
	cout<<a[3][1]<<endl;
    return 0;
}

2.使用<vector>

a.at(1).at(3)

<vector>中.at()可以检查是否越界

<pre name="code" class="cpp">vector<vector <double> > a(3);
需要加入这句话,可以检查二维a.at().at().

 
 
#include <iostream>
#include <vector>
using namespace std;
template <class T>
class Array
{
private:
    T *arr;
    int arrsize;
public:
    Array(int asize=100):arrsize(asize)
    {
        arr=new T[asize];
    }
    ~Array()
    {
        delete []arr;
    }
    T& operator[](int ind);
    operator T*()
    {
        return arr;
    }
    void resize(int rsize);
};
template <class T>
T& Array<T>::operator[](int ind)
{
    static T t;
    if (ind<arrsize&&ind>=0)
        return arr[ind];
    else
    {
        cout<<"下标出界:("<<ind<<")";
        return t;
    }
}
template <class T>
void Array<T>::resize(int rsize)
{
    if (rsize<0||rsize==arrsize)
        return ;
    T *newarr=new T[rsize];
    int n=(rsize<arrsize)?rsize:arrsize;
    for(int i=0; i<n; i++)
        newarr[i]=arr[i]; //保存原数组值
    delete []arr;
    arr = newarr;
    arrsize = rsize;
}
int main()
{
//    Array<Array <double> > a(3);
    vector<vector <double> > a(3);
    int i,j;
    a[0].resize(2);
    a[1].resize(2);
    a[2].resize(2);
    for(i=0; i<3; i++)
        for(j=0; j<2; j++)
            a[i][j] = 10*i+j;
    cout<<a[1][1]<<endl;
    cout<<a[1][3]<<endl;
    cout<<a[3][1]<<endl;  //出现终止程序
//	a[3][1]=1;
    cout<<a.at(1).at(3)<<endl; //越界检查 , a[1][3] 不同
    return 0;
}

3.重新设计二维数组。

#include <iostream>
using namespace std;
template <class T>
class Array
{
private:
    T *arr;
    int arrsize;
public:
    Array(int asize=100):arrsize(asize){arr=new T[asize];}
    ~Array(){delete []arr;}
    T& operator[](int ind);
    operator T*() {return arr;}
	void resize(int rsize);
};
template <class T>
T& Array<T>::operator[](int ind)
{
    static T t;
    if (ind<arrsize&&ind>=0)
        return arr[ind];
    else
    {
        cout<<"下标出界:("<<ind<<")";
        return t;
    }
}
template <class T>
void Array<T>::resize(int rsize){
	if (rsize<0||rsize==arrsize)
		return ;
	T *newarr=new T[rsize];
	int n=(rsize<arrsize)?rsize:arrsize;
	for(int i=0;i<n;i++)
		newarr[i]=arr[i]; //保存原数组值
	delete []arr;
	arr = newarr;
	arrsize = rsize;
}
template <class T>
class Array2
{
private:
    Array<T> *arr;
    int arrrow,arrcol;
public:
    Array2(int =100,int =100);
    ~Array2(){delete []arr;	};
    Array<T>& operator[](int ind);
    operator Array<T>*() {return arr;}
};
template <class T>
Array2<T>::Array2(int row,int col):arrrow(row),arrcol(col)
{
	arr=new Array<T>[row];
	for(int i = 0; i < row; i++)
		arr[i].resize(col);
};
template <class T>
Array<T>& Array2<T>::operator[](int ind){
    static Array<T> t;
    if (ind<arrrow&&ind>=0)
        return arr[ind];
    else
    {
        cout<<"下标2出界:("<<ind<<")";
        return t;
    }
}

int main()
{
    Array2<double> a(3,2);
    int i,j;
    for(i=0;i<3;i++)
        for(j=0;j<2;j++)
            a[i][j] = 10*i+j;
//	cout<<(*(a+1))[1]<<endl;
//	cout<<*(a[1]+0)<<endl;
//	cout<<*(*(a+0)+1)<<endl;
	cout<<a[1][1]<<endl;
	cout<<a[1][3]<<endl;
	cout<<a[3][1]<<endl;
    return 0;
}

不能重载【】【】。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值