zoukankan      html  css  js  c++  java
  • 类模板的定义和使用

        上次我们已经讲述了使用类模板的好处,今天我们来讲解一下如何定义和使用类模板?

        类模板的定义和类的定义很相似,唯一不同的地方是类模板需要使用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 << "	";
    		pTempNode = pTempNode->m_pNext;
    	}
    	cout << endl;
    }
    #endif
    
    
    main.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通过模板类名,后追加一对尖括号,尖括号中输入类模板实参,之后模板类对象的使用方式和普通类对象的使用方式一致。

        小结

        今天,我们主要讲述了如何定义一个类模板以及如何使用类模板。希望大家回去实践一下,加深体会。


  • 相关阅读:
    《你的知识需要管理》——田志刚
    《谁动了我的奶酪》——[美]斯宾塞·约翰逊
    《程序员面试宝典(第三版)》——欧立奇 / 刘洋 / 段韬
    《天才在左疯子在右》——高铭
    LintCode: Combination Sum
    LintCode: Flatten Binary Tree to Linked List
    LintCode: First Position of Target
    LintCode: Delete Node in the Middle of Singly Linked List
    LintCode: Maximum Depth of Binary Tree
    pytorch visdom可视化工具学习—3-命令行操作使用经验
  • 原文地址:https://www.cnblogs.com/new0801/p/6177017.html
Copyright © 2011-2022 走看看