类模板实例(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;
}
上一篇: 构造和析构函数