模板
今天看了模板一章,真是头疼啊,什么乱七八糟的东西,template,class,以是<>的,真是一个字乱,看书上的源代码,还有点感觉,不过有些怪,上机调试一下,果不其然,错误十好几个:|,真是有些悲哀啊,书都出了这么多年了,错误还是错误,根本没有改,发行量小一些还好,偏偏发行量还那么大,如果一点也不了解的话,死的真的会很“抽象”的(呵呵,幸亏花了100多元搞了本C++ Primer 3rd,要不然,偶也被抽象了,汗一个先)
下面是代码,已经改过很多了,可以运行了,不过,就是不能把那两个成员:int ArraySize,Type* Element设置成private,否则那个重载>>老是报错,InStream>>InList.ArraySize中的ArraySize因为是private,无法访问,试了很多,也没解决,不知道怎么回事,看C++ Primer 3rd上也有类似代码,也是那样的,不知道是什么原因,愚蒙中。。。。
还有就是用VC++ 6.0明明好好的,到了.NET里老是出错,说什么“包含头文件的非预料结尾”,文件明明是好的,真是的也有这种错误。
/* 数据结构(用面向对象方法与C++描述)
* 第20页1.6模板(templates)
* 示例算法之类定义文件:datalist.h
* -------by Speed1
*/
#ifndef DATALIST_H //类定义放在头文件datalist.h中
#define DATALIST_H
#include <iostream.h>
//const int SIZE=10;
template <class Type> //模块标识
class dataList //类标识
{
private:
void Swap(const int mark1,const int mark2);
int MaxKey(const int low,const int high);
public:
int ArraySize;
Type* Element; //存入数据的数组dataList(int size=10 ): ArraySize(size), Element(new Type[size]) {} //构造函数
~dataList() {delete []Element;} //析构函数
void Sort();
friend ostream& operator<<(ostream& outStream,const dataList<Type>& outList);
friend istream& operator>>(istream& inStream,const dataList<Type>& inList);
};
#endif
/* 数据结构(用面向对象方法与C++描述)
* 第20页1.6模板(templates)
* 示例算法之类的操作实现头文件selecttm.h
* -------by Speed1
*/
#ifndef SELECTTM_H //类服务的实现入在头文件selecttm.h中
#define SELECTTM_H
#include "datalist.h"
template<class Type> void dataList<Type>::Swap(const int mark1,const int mark2)
{
//交换由mark1,mark2为下标的两个数组元素的值。
Type temp=Element[mark1];
Element[mark1]=Element[mark2];
Element[mark2]=temp;
}
template <class Type> int dataList<Type>::MaxKey(const int low,const int high)
{
//查找数组Element[low]~Element[high]中的最大值,函数返回其位置
int max=low; //假定第low个为最大者,由max标识之
for(int k=low+1;k<=high;k++)
if(Element[max]<Element[k]) max=k;
return max;
}
template <class Type> ostream& operator<<(ostream& OutStream,const dataList<Type>& OutList)
{
//输出重载操作符<<的实现,输出对象为OutList,输出对象为OutStream。
OutStream<<"Array Contents:/n";
for(int i=0;i<OutList.ArraySize;i++)
OutStream<<OutList.Element[i]<<" ";
OutStream<<endl;
OutStream<<"Array Current Size:"<<OutList.ArraySize<<endl;
return OutStream;
}
template <class Type> istream& operator>>(istream& InStream,dataList<Type>& InList)
{
//输入操作符重载>>的实现,输入对象为InList,输入流对象为:InStream。
cout<<"Enter array Current Size:";
InStream>>InList.ArraySize;
cout<<"Enter array element:/n";
for(int i=0;i<InList.ArraySize;i++)
{
cout<<"Element"<<i<<":";
InStream>>InList.Element[i];
}
return InStream;
}
template <class Type> void dataList<Type>::Sort()
{
//按非递减的顺序对ArraySize个关键码Element[0]~Element[ArraySize-1]排序
for(int i=ArraySize-1;i>0;i--)
{
int j=MaxKey(0,i);
if(j!=i) Swap(j,i);
}
}
#endif
/* 数据结构(用面向对象方法与C++描述)
* 第20页1.6模板(templates)
* 示例算法之主程序
* -------by Speed1
*/
#include "selecttm.h"
const int SIZE=10;
int main()
{
dataList <int> TestList(SIZE);
cin>>TestList;
cout<<"Testing Selection Sort;/n"<<TestList<<endl;
TestList.Sort();
cout<<"After sorting:/n"<<TestList<<endl;
return 0;
}