类设计--二维数组

来源:互联网 发布:德尔无醛芯地板知乎 编辑:程序博客网 时间:2024/06/05 11:28
重载运算符 [][]

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

利用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;}
不能重载【】【】。

0 0
原创粉丝点击