C++的二维数组是不能用变量初始化的,像下面的代码肯定是编译不通过的:
int i=5;
int j=4;
int a[i][j];
int j=4;
int a[i][j];
像这样的代码肯定是很多C++像我一样的初学者的困感,如果数组是在编译的阶段确定其内存位置的,而变量不能作为数组的维数.
下面,用一个模板类,完成这种功能
template<class T>
class Array2D{
private:
T* pData;
int dim1;
int dim2;
int dim1Index;
class Array1D{
private:
int length;
T* start;
public:
Array1D(T* start,int length):length(length),start(start){}
T& operator[](int index){
if(index>length){
throw out_of_range("数组第二维数越界");
}else{
return *(start+index);
}
}
};
public:
Array2D(int dim1,int dim2){
this->dim1=dim1;
this->dim2=dim2;
int size=dim1*dim2;
pData=new T[size];
}
Array1D operator[](int index){
return Array1D(pData+index*dim1,dim2);
}
void print(){
for(int i=0;i<dim1;i++){
for(int j=0;j<dim2;j++){
cout<<*(pData+dim1*i+j)<<" ";
}
cout<<endl;
}
}
};
int main(){
int index1=2;
int index2=2;
Array2D<int> test(index1,index2);
test[0][0]=1;
test[0][1]=2;
test[1][0]=3;
test[1][1]=4;
test.print();
}
class Array2D{
private:
T* pData;
int dim1;
int dim2;
int dim1Index;
class Array1D{
private:
int length;
T* start;
public:
Array1D(T* start,int length):length(length),start(start){}
T& operator[](int index){
if(index>length){
throw out_of_range("数组第二维数越界");
}else{
return *(start+index);
}
}
};
public:
Array2D(int dim1,int dim2){
this->dim1=dim1;
this->dim2=dim2;
int size=dim1*dim2;
pData=new T[size];
}
Array1D operator[](int index){
return Array1D(pData+index*dim1,dim2);
}
void print(){
for(int i=0;i<dim1;i++){
for(int j=0;j<dim2;j++){
cout<<*(pData+dim1*i+j)<<" ";
}
cout<<endl;
}
}
};
int main(){
int index1=2;
int index2=2;
Array2D<int> test(index1,index2);
test[0][0]=1;
test[0][1]=2;
test[1][0]=3;
test[1][1]=4;
test.print();
}
用一个模板类实现这个功能,是一个不错的选择,但在实际中,是很少有人这样写的,这是在more effective C++给出的方法,目的是为了说明proxy模式,Array1D是作为一个proxy类存在的。