类模板的定义格式
template<class T1, class T2, ..., class Tn>
class 类模板名
{
// 类内成员定义
};
使用类模版构建动态顺序表
template <class T>
class SeqList {
T* m_data;
size_t m_size;
size_t m_capacity;
void checkCapacity();
public:
SeqList(size_t size = 0, size_t capacity = 10) :
m_data(new T[capacity]),
m_size(size),
m_capacity(capacity)
{
}
T& operator [](size_t i)
{
return m_data[i];
}
void push_back(const T& src);
void pop_back();
int size();
~SeqList();
};
// 在类中声明,在类外定义。
// 注意:类模板中函数放在类外进行定义时,需要加模板参数列表
template <class T>
void SeqList<T>::checkCapacity() {
if (m_size == m_capacity) {
m_capacity *= 2;
m_data = (T*)realloc(m_data, sizeof(T) * m_capacity);
/*T* newSpace = new T[m_capacity];
for (i = 0; i < m_size; i++) {
newSpace[i] = m_data[i];
}
delete[] m_data;
m_data = newSpace;*/
}
}
template <class T>
void SeqList<T>::push_back(const T& src) {
checkCapacity();
m_data[m_size++] = src;
}
template <class T>
void SeqList<T>::pop_back() {
if (m_size == 0) {
return;
}
m_size--;
}
template <class T>
int SeqList<T>::size() {
return m_size;
}
template <class T>
SeqList<T>::~SeqList() {
if (m_data) {
delete[] m_data;
}
m_size = m_capacity = 0;
}
注意:SeqList不是具体的类,是编译器根据被实例化的类型生成具体类的模具
类模版实现切记:
-
在类模版的实现过程中,最好不要将class与函数实现拆成两个文件。直接在.h文件中将函数实现还有类做完成。
-
如果拆成两个文件,必须将两个文件全部include到main函数的文件中,要不然就找不到对应的实现代码,也就无法生成一个实体版的可执行的函数。
类模板的实例化
类模板实例化与函数模板实例化不同,类模板实例化需要在类模板名字后跟<>,然后将实例化的类型放在<> 中即可,类模板名字不是真正的类,而实例化的结果才是真正的类。
代码示例:
int main(){
// SeqList类名,SeqList<int>才是类型
SeqList<int> sl;
sl.push_back(1);
sl.push_back(2);
sl.push_back(3);
sl.pop_back();
SeqList<double> s1;
s1.push_back(3.1415);
s1.push_back(1.618);
for (int i = 0; i < sl.size(); ++i)
{
cout << sl[i] << " ";
}
cout << endl;
for (int i = 0; i < s1.size(); ++i)
{
cout << s1[i] << " ";
}
cout << endl;
return 0;
}
代码生成图
如有不同见解,欢迎留言讨论