问题描述
实现一个三维数组模版CArray3D,可以用来生成元素为任意类型变量的三维数组,使得下面程序输出结果是:
0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,
注意,只能写一个类模版,不能写多个。
#include
using namespace std;
// 在此处补充你的代码
int main()
{
CArray3D<int> a(3,4,5);
int No = 0;
for( int i = 0; i < 3; ++ i )
for( int j = 0; j < 4; ++j )
for( int k = 0; k < 5; ++k )
a[i][j][k] = No ++;
for( int i = 0; i < 3; ++ i )
for( int j = 0; j < 4; ++j )
for( int k = 0; k < 5; ++k )
cout << a[i][j][k] << ",";
return 0;
}
输入
无
输出
0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,
样例输入
无
样例输出
0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,
提示
提示:类里面可以定义类,类模版里面也可以定义类模版。例如:
class A
{
class B {
};
};
template
class S
{
T x;
class K {
T a;
};
};
PS:这道题还是废了点时间的,尤其算法1中刚开始写的为屏蔽部分的代码,编译成功,运行会出错,至今仍不清楚错误在哪(可能需要重载赋值运算符,默认的又有什么作用?)。**算法2是网上看到的,写的很好,摘抄如下。
源码
算法1
#include
using namespace std;
// 在此处补充你的代码
template
class CArray3D
{
public:
template <class T1>
class CArray2D
{
private:
T1 *a1;//指向二维数组的指针
int row;//数组行数
int column;//数组列数
public:
CArray2D():a1(NULL),row(0),column(0) {}
CArray2D(int paraRow, int paraColumn):row(paraRow),column(paraColumn) { a1 = new T1[row*column];}
void set(int paraRow, int paraColumn)
{
row = paraRow;
column = paraColumn;
a1 = new T1[row*column];
}
~CArray2D(){if(a1) delete[] a1;}
T1* operator[](int i) {return a1+i*column;}//重载的实际上是第二维的[], 第一维的[]直接调用int型一维数组的定义
};
private:
CArray2D *ptr;
public:
CArray3D():ptr(NULL) {}
CArray3D(int z, int y, int x)
{
ptr = new CArray2D[z];
for (int m = 0; m < z; m++)
{
ptr[m].set(y,x);
// CArray2D a(y, x);
// ptr[m] = a;
}
}
CArray2D& operator[](int i){return ptr[i];}
~CArray3D(){if (ptr){delete[] ptr;}}
};
int main()
{
CArray3D<int> a(3,4,5);
int No = 0;
for( int i = 0; i < 3; ++ i )
for( int j = 0; j < 4; ++j )
for( int k = 0; k < 5; ++k )
a[i][j][k] = No ++;
for( int i = 0; i < 3; ++ i )
for( int j = 0; j < 4; ++j )
for( int k = 0; k < 5; ++k )
cout << a[i][j][k] << ",";
return 0;
}
算法2
#include
using namespace std;
template
class CArray3D
{
public:
template <class T1>
class CArray2D
{
public:
template <class T2>
class CArray1D
{
public:
CArray1D()
{
a = NULL;
}
void set(int n)
{
if(a) delete[]a;
a = new T[n];
}
T2 &operator[](int i)
{
return a[i];
}
~CArray1D(){delete []a;}
private:
T2 * a;
};
CArray2D()
{
a1 = NULL;
}
void set(int m, int n)
{
a1 = new CArray1D [m];
for(int i = 0; i < m; i ++)
a1[i].set(n);
}
~CArray2D()
{delete [] a1;}
CArray1D & operator[](int i)
{
return a1[i];
}
private:
CArray1D * a1;
};
CArray3D(int p, int m, int n)
{
a2 = new CArray2D [p];
for(int i = 0; i < p; i ++)
a2[i].set(m,n);
}
~CArray3D(){delete[] a2;}
CArray2D& operator[](int i)
{
return a2[i];
}
private:
CArray2D *a2;
};
int main()
{
CArray3D<int> a(3,4,5);
int No = 0;
for( int i = 0;i < 3; ++ i )
for(int j = 0; j < 4; ++j )
for(int k = 0; k < 5; ++k )
a[i][j][k]= No ++;
for( int i = 0;i < 3; ++ i )
for(int j = 0; j < 4; ++j )
for(int k = 0; k < 5; ++k )
cout<< a[i][j][k] << ",";
return 0;
}