类模板的定义和使用
来源:互联网 发布:部落冲突数据大全 编辑:程序博客网 时间:2024/05/21 11:37
上次我们已经讲述了使用类模板的好处,今天我们来讲解一下如何定义和使用类模板?
类模板的定义和类的定义很相似,唯一不同的地方是类模板需要使用template关键字来引出类模板需要使用的抽象类型。
类模板定义的语法大致如下:
template<模板参数类型列表>
class 模板类名
{
...
};
为了方便大家的理解,我们通过实际的例子来讲解。
例1 定义和使用栈类模板
MyStack.hpp的内容:
#ifndef _MYSTACK_HPP_#define _MYSTACK_HPP_#include<iostream>using namespace std;template<typename T> class CMyStack;template<typename T>class CNode{public:CNode(T v) :m_Data(v), m_pNext(NULL){};protected:T m_Data;CNode * m_pNext;friend class CMyStack<T>;};template<typename T>class CMyStack{public:CMyStack():m_pFirst(NULL){};~CMyStack(){CNode<T> * pTemp = m_pFirst;while (pTemp){m_pFirst = m_pFirst->m_pNext;delete pTemp;pTemp = m_pFirst;}}bool Push(T node);T Top() throw (std::runtime_error);void Pop();bool IsEmpty();void Print();protected:CNode<T> * m_pFirst;};template<typename T>bool CMyStack<T>::Push(T Node){ CNode<T> * pNewNode = new CNode<T>(Node);if (!pNewNode){return false;}pNewNode->m_pNext = m_pFirst;m_pFirst = pNewNode;return true;}template<typename T>T CMyStack<T>::Top() throw (std::runtime_error){if (!m_pFirst){throw std::runtime_error("stack is empty.");}return m_pFirst->m_Data;}template<typename T>void CMyStack<T>::Pop(){T val;CNode<T> * pTempNode = m_pFirst;if (!m_pFirst){return;}m_pFirst = m_pFirst->m_pNext;delete pTempNode;pTempNode = NULL;return;}template<typename T>bool CMyStack<T>::IsEmpty(){if (!m_pFirst){return true;}return false;}template<typename T>void CMyStack<T>::Print(){CNode<T> * pTempNode = m_pFirst;while (pTempNode){cout << pTempNode->m_Data << "\t";pTempNode = pTempNode->m_pNext;}cout << endl;}#endifmain.cpp的内容:
#include "MyStack.hpp"void main(){CMyStack<int> IntStack;CMyStack<float> FloatStack;IntStack.Push(1);IntStack.Push(2);IntStack.Push(3);IntStack.Push(4);IntStack.Push(5);cout << "整型栈:" << endl;IntStack.Print();while (!IntStack.IsEmpty()){cout << "栈顶" << IntStack.Top() << endl;cout << "出栈" << endl;IntStack.Pop();}FloatStack.Push(1.1);FloatStack.Push(2.2);FloatStack.Push(3.3);FloatStack.Push(4.4);FloatStack.Push(5.5);cout << "浮点栈:" << endl;FloatStack.Print();while (!FloatStack.IsEmpty()){cout << "栈顶" << FloatStack.Top() << endl;cout << "出栈" << endl;FloatStack.Pop();}system("pause");}运行效果如图1所示:
图1 栈类模板的运行效果
在例1中,MyStack.hpp定义了一个栈类模板CMyStack,main.cpp使用了栈类模板CMyStack。栈类模板的定义首先以template开头,后追加一对尖括号,尖括号中输入模板参数,之后模板的定义和类的定义基本一致。另外还需要强调的一点是,如果将模板类中的成员函数放在模板类之外定义,需要在函数定义之前写上template,后追加一对尖括号,尖括号中输入模板参数,同时模板类名后也要追加一对尖括号,尖括号中输入模板参数。
在例1中,main.cpp通过模板类名,后追加一对尖括号,尖括号中输入类模板实参,之后模板类对象的使用方式和普通类对象的使用方式一致。
小结
今天,我们主要讲述了如何定义一个类模板以及如何使用类模板。希望大家回去实践一下,加深体会。
0 0
- 类模板的定义和使用
- 类模板的定义和使用
- 类模板的定义和使用
- 类模板的定义和使用
- 类模板的定义和使用
- 类模板的定义和使用
- C++ 类模板的定义和使用
- 类模板的定义和使用
- 类模板的定义和使用
- 类模板的定义和使用
- 函数模板和类模板的定义和使用
- C++模板类的声明、定义和使用
- C++模板类的声明、定义和使用
- 函数模板的定义和使用
- C++模板类声明、定义和使用
- 类模板的定义及其使用
- 类模板的定义和实例化
- 类模板的声明和定义
- python 进阶学习之13
- VS注释与取消注释快捷键
- Discuz X2.5 取消登陆密码异常15分钟限制的方法
- 获取内存大小:总内存 & sd卡内存
- 学习的书籍
- 类模板的定义和使用
- 围住神经猫源码下载地址 火爆的网站引流游戏 微信公众号最快加粉丝游戏
- SVProgressHUD的使用
- AVAudio 2
- UIALertView的基本用法与UIAlertViewDelegate对对话框的事件处理方法
- MyBatis的动态SQL详解
- The type Database cannot be constructed. You must configure the container to supply this value.
- libevent 例子
- kd-tree c语言代码