动态初始化数组

C++的二维数组是不能用变量初始化的,像下面的代码肯定是编译不通过的:

int i=5;
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();
}

  用一个模板类实现这个功能,是一个不错的选择,但在实际中,是很少有人这样写的,这是在more effective C++给出的方法,目的是为了说明proxy模式,Array1D是作为一个proxy类存在的。

posted @ 2012-06-05 16:40  龙龙爱琴琴  阅读(458)  评论(0编辑  收藏  举报