欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

类模板实例(1)

程序员文章站 2022-03-11 18:00:59
...

类模板中的要点:

类内成员方法也是可以有模板的;也会涉及到成员方法的模板以及成员方法模板的特例化

优先级是  成员方法 > 模板的特例化  > 模板在任何情况下都是如此!)

#include<iostream>
using namespace std;

template<typename T>
class LinkedList {
public:
	class LinkedNode {
	public:
		T _val;
		LinkedNode *_next;
		LinkedNode(T value = T()) {
			_val = value;
			_next = NULL;
		}	//构造方法
	};
	LinkedList();	//构造函数
	~LinkedList();	//析构函数
	void headInsert(T value);	//头部插入
	void show();	//打印输出
	bool delNode(T value);	//删除某个节点
	LinkedNode *queryNode(T value);		//成员方法  查找是否包含某个节点
	//优先级顺序为  成员方法 > 模板特例化  > 模板
	/*成员方法也是函数,故而可以抽象成模板,类模板的成员方法的特例化不能在类外实现,否则会产生语法错误*/
	
	template<typename E>
	LinkedNode *queryNode(E value);
	template<>
	LinkedNode *queryNode<char *>(char *value) 
	{
		cout << "LinkedList *queryNode<char *>(char *value)" << endl;
		LinkedNode *p = _head->_next;
		while (!p)
		{
			if (strcmp(value, p->_val)) return p;
			p = p->_next;
		}
		return NULL;
	}
private:
	LinkedNode *_head;
};

//实现构造方法
template <typename T>
LinkedList<T>::LinkedList(){	
	_head = new LinkedNode();
}

//实现析构方法
template<typename T>
LinkedList<T>::~LinkedList() {		
	LinkedNode *p = _head;	//从头节点开始一步到位
	while (p != NULL) {
		p = _head->_next;	//p后移
		delete _head;
		_head = p;
	}
}

//实现头部插入
template<typename T>
void LinkedList<T>::headInsert(T value) {	
	LinkedNode *p = new LinkedNode(value);
	p->_next = _head->_next;
	_head->_next = p;
}

//实现打印输出
template<typename T>
void LinkedList<T>::show() {		
	LinkedNode *p = _head->_next;
	while (p != NULL) {
		cout << p->_val << "  ";
		p = p->_next;
	}
	cout << endl;
}

//实现删除
template<typename T>
bool LinkedList<T>::delNode(T value) {		
	LinkedNode *p = _head;
	while (p->_next != NULL) {
		if (value == p->_next->_val) {
			LinkedNode *q = p->_next;
			p->_next = q->_next;	//p的后继变成待删除节点的后继
			delete q;
			return true;
		}
		p = p->_next;
	}
	return false;
}

//成员方法查找是否包含某个特定值的节点
template<typename T>	
typename LinkedList<T>::LinkedNode * LinkedList<T>::queryNode(T value) 
{
	cout << "LinkedNode *queryNode(T value)" << typeid(value).name() << endl;
	LinkedNode *p = _head->_next;
	while (p != NULL) {
		if (value == p->_val) return p;
		p = p->_next;
	}
	return NULL;
}

//成员方法查找是否包含某个特定值的节点的模板
template<typename T>
template<typename E>
typename LinkedList<T>::LinkedNode *LinkedList<T>::queryNode(E value) {
	cout << "LinkedList<T>::LinkedNode *LinkedList<T>::queryNode(E value)" << typeid(value).name() << endl;
	LinkedNode *p = _head->_next;
	while (p != NULL) {
		if (value == p->_value) return p;
		p = p->_next;
	}
	return NULL;
}

/*测试用例*/
int main() {
	LinkedList<int> list;
	for (int i = 0; i < 10; ++i)
		list.headInsert(i);
	list.show();
	list.delNode(5);
	list.show();
	LinkedList<int>::LinkedNode *p = list.queryNode(1);
	if (NULL != p)
		cout << p->_val << "  " << endl;
	system("pause");
	return 0;
}
类模板实例(1)
图1  运行结果
相关标签: 类模板 嵌套类