彭小盛

又一个WordPress站点

c++类模板用法-程序视野

c++类模板用法-程序视野
夏一可在编写类模板的程序时高湛和陆贞,把类模板的成员函数的声明和实现分别写在了头文件和源文件中,导致了出现编译出错的现象,现弄清楚了原因,特写此篇狂侠天骄魔女,供大家参考学习。
c++中每一个对象所占用的空间大小,是在编译的时候就确定的,在模板类没有真正的被使用之前,编译器是无法知道模板类中使用模板类型的对象所占用的空间大小的。只有模板被真正使用的时候王琪飞 ,编译器才知道,模板套用的是什么类型,应该分配多少空间。这也是模板类称之为模板而不是泛型的原因。
既然是在编译的时候,根据套用的不同类型进行编译,那么,套用不同类型的模板类实际上就是两个不同的类型,也就是说,vector<int>和vector<char>是两个不同的数据类型,他们共同的成员函数也不是一个函数,只不过具有相似的功能。因而模板类在套用不同类型之后,会被编译出不同代码。
所以模板类的实现,脱离具体的使用,是无法单独的编译的;也就是说把声明和实现分开的做法是不可取的,必须把实现全部写在头文件里面。为了代码清晰,可以把实现写在类的外面。
下面是具体的代码实现:
以简单的冒泡排序为例写的类模板.h头文件如下:
template<classT>
classSortClass{
public:
//冒泡排序初级版:两两比较相邻记录的关键字
voidBubbleSort0(Tdata[],intn)
{
for(inti=0;i<n;++i)
{
for(intj=i+1;j<n;++j)
{
if(data[i]>data[j])
{
swap(data[i],data[j]);
}
}
}
}
private:
voidswap(T&a,T&b)
{
Ttemp;
temp=a;
a=b;
b=temp;
}
};
这种写法是把类模板的成员函数实现写在了类里。
还可以把类模板的成员函数实现写在类外。代码如下:
template<classT>
classSortClass{
public:
voidBubbleSort0(Tdata[],intn);
private:
voidswap(T&a颓唐的意思 ,T&b)
{
Ttemp;
temp=a;
a=b;
b=temp;
}
};
//这个类模板的成员函数实现
template<classT>
voidSortClass<T>::BubbleSort0(Tdata[]梦里水乡简谱,intn)
{
for(inti=0;i<n;++i)
{
for(intj=i+1;j<n;++j)
{
if(data[i]>data[j])
{
swap(data[i],data[j]);
}
}
}
}
下面是对类模板的成员函数的调用c++代码:
#include<iostream>
#include"sortImple.h"
usingnamespacestd;
intmain()
{
SortClass<int>s;
inta[10]={9,4园丁的乐趣 ,2,7,3济阴之贾人 ,1,5脆蛇蜥 ,8听听秋的声音 ,6宫胁咲良,0};
cout<<"排序前数组的元素值"<<endl;
for(inti=0;i<10;++i)
cout<<a[i]<<"";
cout<<endl;
s.BubbleSort0(a,10);
cout<<"排序后数组的元素值"<<endl;
for(inti=0;i<10;++i)
cout<<a[i]<<"";
cout<<endl;
return0;
}
程序输出如下: