《(7.6)--7.6 类模板与友元面向对象程序设计.ppt》由会员分享,可在线阅读,更多相关《(7.6)--7.6 类模板与友元面向对象程序设计.ppt(10页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。
1、 类模板与友元类模板与友元在此输入您的封面副标题类模板与友元有三种情况:(1)函数、类、类的成员函数作为类模板的友元;(2)函数模板作为类模板的友元;(3)类模板作为类模板的友元。函数、类、类的成员函数作为类模板的友元template /顺序表类模板定义class SeqLn public:SeqLn():size(0)/类模板的构造函数SeqLn()/类模板的析构函数void Insert(const T&m,const int i);/数据类型为模板形参TT Delete(const int i);/返回值类型为模板形参Tint LnSize()const return size;frie
2、nd void Success()cout顺序表构造完成endl;/普通的函数作为类模板的友元private:T arrLen;/数据元素的类型为模板形参T,Len为常量,数组的大小int size;template /成员函数Insert的模板定义void SeqLn:Insert(const T&m,const int nst)/将m插入到arr数组中下标为nst的位置if(nstsize)/判断插入位置nst是否合法cerrnst Error!endl;exit(1);if(size=Len)/判断顺序表是否已满,若已满则不能做插入操作cerrthe List is over,cant
3、insert any data!=nst;i-)arri+1=arri;/将下标为size到nst范围内的元素依次向后移动一个位置 arrnst=m;/将m写入arrnst处 size+;/顺序表长度加1template /成员函数Delete的模板定义T SeqLn:Delete(const int nst)/删除数组arr中下标为nst的元素 if(nstsize-1)/判断删除位置nst是否合法cerr删除位置错误!endl;exit(1);if(size=0)/判断顺序表是否为空,若为空则不能做删除操作cerrthe List is null,no data can be delete
4、d!endl;exit(1);T temp=arrnst;/取出arrnst到临时变量temp中for(int i=nst;i=size;i+)/将下标为nst到size范围内的元素依次向前移动一个位置arri-1=arri;size-;/顺序表长度减1return temp;/返回temp变量中存储的arrnst的值int main()int i;SeqLnc_List;/定义char型顺序表类对象SeqLni_List;/定义int型顺序表类对象 Success();return 0;函数模板作为类模板的友元template /顺序表类模板定义class SeqLn public:.tem
5、plate friend void Display(SeqLn&mySeqLn);template friend void Tranform(SeqLn&src,SeqLn&dest);.;template /类模板的友元函数模板Display的定义void Display(SeqLn&mySeqLn)for(int i=0;imySeqLn.size;i+)coutsetw(5)mySeqLn.arri;if(i+1)%8=0)/每行输出8个元素coutendl;template/类模板的友元函数模板Tranform的定义 void Tranform(SeqLn&src,SeqLn&dest
6、)/功能是将SeqLn类的顺序表src转换为SeqLn类的顺序表dest dest.size=src.size;/将src顺序表的长度赋值给dest顺序表的长度 for(int i=0;isrc.size;i+)/将src顺序表中所有元素强制类型转换为T类型的后存储到dest顺序表相对应的位置中dest.arri=T2(src.arri);int main()int i;SeqLnc_List;/定义char型顺序表类SeqLn的对象SeqLni_List;/定义int型顺序表类SeqLn的对象 c_List.Insert(a,0);c_List.Insert(b,0);c_List.Inse
7、rt(c,0);cout转换前的数据列表:;Display(c_List);/输出转换前的结果coutendl;CharToInt(c_List,i_List);cout转换后的数据列表:;Display(i_List);/输出转换后的结果程序运行结果:转换前的数据列表:c b a转换后的数据列表:99 98 97类模板作为类模板的友元template class B;/说明B是个类模板template /顺序表类模板的定义class SeqLn public:.template friend class B;/说明类模板B是类模板SeqLn的友元 .;template/类模板B的定义class Bpublic:void func()SeqLn sq;sq.Insert(10,0);Display(sq);int main()B b;b.func();return 0;B类是SeqLn类的友元,任何从B模板实例化出来的类都是任何从SeqLn实例化出来的类的友元