数据结构——类模板

数据结构——类模板

类模板

类模板是一种用于创建通用类的机制,它可以让程序员编写一次类,然后让它适用于多种数据类型,在实际编程中非常实用。

优点:使用类模板时,可以为同一个类使用不同的数据类型,这使得代码更加灵活。例如,一个通用的栈类模板可以用于intdoublechar等不同类型,而不需要为每种类型分别定义栈类。

定义方式

1
2
3
4
5
6
7
8
9
template <class T>
class MyStack {
public:
// 构造函数、析构函数、入栈、出栈等函数
private:
T* data;
int top;
};

template 关键字用于声明类模板

函数声明与定义

类内定义

如果是在类内进行函数定义,则不需添加template<>,如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// 类模板
template <class T1,class T2>
class Data {
private:
T1 a;
T2 b;
public:
Data(T1 a, T2 b){
this->a = a;
this->b = b;
cout << "Data的有参构造" << endl;
}
void showData()
{
cout << a << " " << b <<endl;
}
};

类外定义

如果成员函数在类外定义

  • 在每个成员函数前必须添加template<>
  • 作用域需要添加<>修饰。
1
2
3
4
5
template<class T1,class T2>
void Data<T1,T2>::showData()
{
cout << a << " " << b << endl;
}

友元函数

1
2
3
4
5
6
7
8
9
//类内声明
friend void MyPrint(Data<T3, T4> &ob);

//类外定义
template <typename T3,typename T4>
void MyPrint(Data<T3, T4> &ob)
{
cout << "函数模板友元:" << ob.a << " " << ob.b << endl;
}

模板类分文件书写问题

方案一

将类的声明和成员函数的定义全部写在一个.h文件中,如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#ifndef _DATA_H_
#define _DATA_H_
#include <iostream>
using namespace std;

// 类模板
template <class T1, class T2>
class Data {
private:
T1 a;
T2 b;
public:
void showData();
};

template<class T1, class T2>
void Data<T1, T2>::showData()
{
cout << a << " " << b << endl;
}

#endif // !_DATA_H_

方案二

若将函数的定义写在.cpp文件中,main.cpp中调用时,一定要同时include”.h”和“.cpp”文件,否则编译错误

1
2
3
4
5
6
7
8
9
10
11
12
13
14
//main.cpp
#include <iostream>
using namespace std;

#include "Data.h"
#include "Data.cpp"
int main()
{
// 类模板实例化对象

Data<int, char> ob2(100,'A');
ob2.showData();
return 0;
}

参考文献

【035】深入理解C++类模板(最全讲解):从基础到实战-CSDN博客