在学习北京大学教授的《程序设计实习 / Practice on Programming》中,遇到了一个习题,花了很长时间研究,现在分享出来:

课题地址:https://class.coursera.org/pkupop-001/human_grading/view/courses/972168/assessments/9/submissions

课题描述:

实现一个三维数组模版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,

注意,只能写一个类模版,不能写多个

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;
} 提示:类里面可以定义类,类模版里面也可以定理类模版。例如:
class A
{
class B {
};
};
template <class T>
class S
{
T x;
class K {
T a;
};
};

课题实现代码:

难点:用set函数实现赋值(开始一直用构造函数实现,需要定义指针的指针)

#include <iostream>
using namespace std; template <class T>
class CArray3D {
template <class T>
class CArray2D {
template <class T>
class CArray1D {
public:
CArray1D():p(NULL){}
void set(T a)
{
p = new T[a];
_a = a;
}
inline T& operator[]( long elem ) const
{
// assert( elem >= 0 && elem < _a );
return p[elem];
} ~CArray1D()
{
delete[] p;
}; private:
T* p;
T _a;
};
public:
CArray2D():p(NULL){}
void set(T a, T b){
p = new CArray1D<T>[a];
for(int i=0; i<a; i++){
p[i].set(b);
}
_b = b;
} inline CArray1D<T>& operator[]( long elem ) const
{
// assert( elem >= 0 && elem < _b );
return p[elem];
} ~CArray2D()
{
delete[] p;
} private:
CArray1D<T>* p;
T _b;
}; public:
CArray3D(T a, T b, T c){
p = new CArray2D<T>[a];
for(int i=0; i<a; i++){
p[i].set(b, c);
}
_c = c;
} inline CArray2D<T>& operator[]( long elem ) const
{
// assert( elem >= 0 && elem < _c );
return p[elem];
} ~CArray3D()
{
delete[] p;
} private:
CArray2D<T>* p;
T _c;
}; 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; }

												

最新文章

  1. RxJS + Redux + React = Amazing!(译一)
  2. 20145205 《Java程序设计》第9周学习总结
  3. 查看 Apache并发请求数及其TCP连接状态
  4. asp.net实现IHttpModule接口注意事项
  5. git同一文件由于文件名大小写不同导致不能合并
  6. date 获取昨天日期
  7. js 常用正则表达式(不断维护中)
  8. restful restAPI 的定义方式
  9. opencv 图片位移
  10. Spark之join、leftOuterJoin、rightOuterJoin及fullOuterJoin
  11. Zookeeper配置文件
  12. poj 2349 求最小生成树里面第m长的边
  13. MAC下绕开百度网盘限速下载的方法,三步操作永久生效
  14. 使用Android Studio调试UiAutomator过程中遇到的问题
  15. js 修改css属性值
  16. EasyUI DataGrid 多级表头设置
  17. 踩坑--springboot打war包
  18. EG:nginx反向代理两台web服务器,实现负载均衡 所有的web服务共享一台nfs的存储
  19. MySQL数据库基本操作(三)
  20. redis错误error记录

热门文章

  1. LoadRunner功能的Jmeter实现
  2. sendmessage和postmessage的区别
  3. EB(存储单位)
  4. 洛谷P1207 [USACO1.2]双重回文数 Dual Palindromes
  5. MySQL学习笔记(二)
  6. OS版本调研
  7. def
  8. 尝试自己建立以alpine 为基础的docker基础镜像和组件镜像
  9. 在ASP.NET开始执行HTTP请求的处理程序之前
  10. leetcode 100