电子科技大学实验报告学生姓名:戴嘉乐学号:2012221010021指导教师:陈安龙实验地点:信软楼305实验时间:2013.12.22一、实验室名称:软件实验室二、实验项目名称:面向对象程序设计—泛型编程三、实验学时:4四、实验原理:所谓泛型编程,就是以独立于任何特定类型的方式编写代码。这使得程序员在编写充分可重用代码时有了趁手的工具。泛型其实是一种形式的静态多态,实现方式是类型参数化。一旦类型本身被参数化,那么我们就可以跃过类型限制带来的鸿沟,用一个类或者函数操纵多种类型不同的对象,并且不需要知道实现的细节。这无疑为代码的编写和维护带来的巨大的好处。在C++中,泛型编程主要依托模板(template)来实现。例如:templatetypenameTTabs(Ta){returna0?a:-a;}其中,T就是参数化的类型。编译器会根据提供的值类型来自动生成对应版本的函数。除了函数模板,C++还提供了类模板,为泛型编程打下了坚实的基础。五、实验目的:本实验通过编写一些简单的程序,使学生掌握泛型编程,并能基本运用模板的语法,培养理论联系实际和自主学习的能力,提高程序设计水平。六、实验内容:前面设计的List类实际上是一种称为“容器”的类。除了容纳形体指针,其实它还可以容纳任何类型的对象。在本实验中,1.请将List类该为模板类,使其能容纳任何类型的对象;2.请为List类编写迭代器。要求如下:a)该迭代器的类名为Iterator;b)该迭代器必须重载如下运算符:++:迭代器后移!=:两个迭代器比较*:返回迭代器指向节点的数据域中的值,即quad指针。=:两个迭代器的复制+。该运算符函数的原型为:Iteratoroperator+(inti);其功能为:假设当前迭代器(的内部指针)指向了第k个节点(从0开始计数),那么+运算符返回一个迭代器,该迭代器是在当前迭代器的基础上向后移动i个位置得到的,即该迭代器指向了第k+i个节点。例如:Iteratoritr=list.begin()+5;那么迭代器itr就指向了从列表的头节点往后数第5个结点。c)为List类编写begin()和end()成员。3.如果时间足够,那么可以选做如下实验:a)将List类的存储实现从单链表改为双向链表。修改过后的链表仍然拥有head和tail指针;b)为List类添加逆向迭代器。该迭代器的行为与正向迭代器非常相似,只不过操作方向正好相反。这需要你为List类再添加两个成员:rbegin():返回一个指向List尾部的迭代器;rend():返回一个指向List头部的迭代器。七、实验器材(设备、元器件):PC机一台,装有C/C++语言集成开发环境。八、实验步骤:步骤一:参考实验指导书3,将实验提供的资料函数canvasOnDraw.txt全部复制下来,然后复制到工程中的canvas.cpp中,替换原来的OnDraw()函数,得到新的Canvas.cpp如下://Canvas.cpp:实现文件//#includestdafx.h#includeexperiment.h#includeCanvas.h#includequad.h#includeparallelogram.h#includerect.h#includesquare.h#includediamond.h#includetrapezoid.h#includeList.h//{{外部说明添加到这里externListQUADPTRlist;templatetypenameT//}}//CanvasCanvas*Canvas::pCanvas=NULL;boolCanvas::isLearning=false;IMPLEMENT_DYNCREATE(Canvas,CScrollView)Canvas::Canvas(){pCanvas=this;quadMap.insert(KV(Parallelogram,para));quadMap.insert(KV(Rectangle,rect));quadMap.insert(KV(Square,sqr));quadMap.insert(KV(Diamond,diam));quadMap.insert(KV(Trapezoid,trap));}staticCStringformatString[]={_T(宽=%d,高=%d,面积=),_T(对角线1=%d,对角线2=%d,面积=),_T(平行边1=%d,平行边2=%d,高=%d,面积=)};Canvas::~Canvas(){}BEGIN_MESSAGE_MAP(Canvas,CScrollView)END_MESSAGE_MAP()//Canvas绘图voidCanvas::OnInitialUpdate(){CScrollView::OnInitialUpdate();//CSizesizeTotal;//TODO:计算此视图的合计大小//sizeTotal.cx=sizeTotal.cy=100;//SetScrollSizes(MM_TEXT,sizeTotal);}union_QUADPTR_{Quadrangle*q;Parallelogram*p;Rect*r;Diamond*d;Square*s;Trapezoid*t;};voidCanvas::OnDraw(CDC*pDC){CDocument*pDoc=GetDocument();//TODO:在此添加绘制代码CRectrect;GetClientRect(&rect);CBrushbr(RGB(220,200,170));CBrush*oldBrush=reinterpret_castCBrush*(pDC-SelectObject(&br));intxc,yc;intvw=rect.Width(),vh=rect.Height();intsw=static_castint(vw*0.75/2.0),sh=static_castint(vh*0.75/2.0);SIZEad[5][4]={{{-sw+50,-sh},{sw+50,-sh},{sw-50,sh},{-sw-50,sh}},{{-sw,-sh},{sw,-sh},{sw,sh},{-sw,sh}},{{-sh,-sh},{sh,-sh},{sh,sh},{-sh,sh}},{{0,-sh},{sw,0},{0,sh},{-sw,0}},{{-sw+120,-sh},{sw-80,-sh},{sw,sh},{-sw,sh}},};doubleratio=1.0;intyOffset=120;if(isLearning){xc=vw/2;yc=vh/2;}else{xc=80;yc=60;ratio=0.3;}POINTvert[4];intshape;List::Iteratoritr,begin=list.begin(),end=list.end();if(isLearning)begin=begin+(list.size()-1);_QUADPTR_quad;stringname;CStringmsg,msg2;for(itr=begin;itr!=end;++itr){quad.q=*itr;name=quad.q-what();area=quad.q-area();shape=quadMap[name];switch(shape){casetrap:msg.Format(formatString[2],quad.t-Width(),quad.t-Width2(),quad.t-Height());break;casediam:msg.Format(formatString[1],quad.p-Width(),quad.p-Height());break;default:msg.Format(formatString[0],quad.p-Width(),quad.p-Height());}if(isLearning)msg2=_T(?);elsemsg2.Format(_T(%.1lf),area);msg+=msg2;for(inti=0;i4;++i){vert[i].x=static_castint(xc+(ad[shape][i].cx*ratio));vert[i].y=static_castint(yc+(ad[shape][i].cy*ratio));}inttx,ty;if(isLearning){tx=xc-sw;ty=yc+sh+8;}else{CBrushbr(RGB(240,240,240));CBrush*oldbr=reinterpret_castCBrush*(pDC-SelectObject(&br));CPen*oldpen=reinterpret_castCPen*(pDC-SelectStockObject(NULL_PEN));pDC-Rectangle(xc-80,yc-50,xc+600,yc+50);pDC-SelectObject(oldbr);pDC-SelectObject(oldpen);tx=xc+yOffset-24;ty=yc-8;yc+=yOffset;}pDC-Polygon(vert,4);pDC-SetBkMode(TRANSPARENT);pDC-TextOutW(tx,ty,msg);}pDC-SelectObject(oldBrush);}voidCanvas::drawQuad(constQuadrangle*quad){if(isLearning)pCanvas-Invalidate();}//Canvas诊断#ifdef_DEBUGvoidCanvas::AssertValid()const{CScrollView::AssertValid();}#ifndef_WIN32_WCEvoidCanvas::Dump(CDumpContext&dc)const{CScrollView::Dump(dc);}#endif#endif//_DEBUGboolCanvas::toggleMode(void){returnisLearning=!isLearning;}步骤二:(按照实验要求修改如下文件代码)修改List.h文件如下://list.h#ifndef_LIST_H#define_LIST_H#includequad.h#includeiostream#includestringtemplatetypenameTclassList{protected:structNode{Tdata;Node*next;Node(constT&d):data(d){}}*head,*tail;size_tlen;protected:voidpush_back(constTquad){Node*p=newNode(data);p-next=NULL;if(tail==NULL)head=tail=p;else{tail-next=p;tail=p;}len++;}public:List():head(NULL),tail(NULL){len=0;}List(Listconst&l){head=tail=NULL;Node*p=l.head;while(p!=NULL){this-push_back(p-data);p=p-next;}len=0;}~List(){Node*p=head,*q;while(p!=NULL){q=p;p=p-next;deleteq;}}Node*Tail(){returntail;}size_tsize(){returnlen;}voidtraverse(void(*f)(constT&)){Node*p=head;inti=1;cout现