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类存在的。
小人本潜水在思源的贴边 ID又多 又有钱 快活乐无边 谁知道站总监 他蛮横不留情面 他勾结站长目无天 占我ID夺我钱 我马甲跟他来翻脸 反被他来把经验减 我同学骂他欺新人 反被他捉进了小黑屋里面 874了一百遍啊一百遍 啊 最后他咬舌自尽 遗恨人间 他还将我和马甲赶出了思源 流落在人间 我为求回思源 无奈行乞在贴前 谁知道站总监他实在太阴险 知道此情形竟派人来暗算将我发文狂删到0篇 小人ID强 残命独留全 可怜马甲他 竟遭删 为求养ID 惟有傍人卖身自作践 一面苦赚钱 一面写诗篇 发誓把名气显 手刃总监意志坚啊 从此总监ID念心间 我永铭记此仇不供戴天 |