类模板(十七)
来源:互联网 发布:ubuntu xampp panel 编辑:程序博客网 时间:2024/06/05 04:54
一、类模板简介
对于一个类中的参数类型变化的情况,需要定义类模板,比如通过类模板定义不同的数据结构,也被称为容器,即STL。对于类模板定义需要注意三个方面:一是在类前添加template<typename Type>以声明该类为一个类模板;二是在类模板中定义的函数都是模板函数,如果是在类内部进行定义可以直接定义,如果在类外定义需要以模板函数的形式进行定义,如template<typename Type> List<Type>::push_back(Type d){......},需要注意的这里的类作用域需要写全,因为使用的是类模板,所以需要加上<Type>,即类模板不是类,它的准确定义就是List<Type>;三是在很多情况下类模板需要调用其他类中的私有成员,如调用ListNode<Type>中的data等,这是需要通过友元即friend方式进行声明,首先需要声明类存在,即template<typename Type> class List<Type>;接着要在类中声明友元,如果一个类需要调用另一个类中的私有成员则需要在该类中将自己定义为友元。即friend class List<Type>。
二、实例介绍
对于类模板用处最多的就是容器类,这里以单链表介绍实例如下:
#include <iostream>
#include <stdlib.h>
template<typename Type>
class List;
template<typename Type>
class ListNode{
public:
friend class List<Type>;
public:
ListNode():data(Type()){}
ListNode(Type d, ListNode<Type> *n):data(d),next(n){}
~ListNode(){}
private:
Type data;
ListNode<Type> *next;
};
template<typename Type>
class List{
public:
List();
bool push_back(Type d);
void show_list()const;
private:
ListNode<Type> *first;
ListNode<Type> *last;
size_t size;
};
template<typename Type>
List<Type>::List(){
first = last = (ListNode<Type> *)malloc(sizeof(ListNode<Type>));
first->next = last;
last->next = NULL;
size = 0;
//char * str = (char *)malloc(sizeof(char)*10);
}
template<typename Type>
bool List<Type>::push_back(Type d){
ListNode<Type> *node = (ListNode<Type> *)malloc(sizeof(ListNode<Type>));
if(node == NULL){
return false;
}
node->data = d;
node->next = NULL;
last->next = node;
last = node;
return true;
}
template<typename Type>
void List<Type>::show_list()const{
ListNode<Type> *p = first;
while(p!=NULL){
std::cout<<p->data<<"->";
p=p->next;
}
std::cout<<"end"<<std::endl;
}
#include "class_template.h"
int main(int argc, char **argv){
List<int> mylist;
for(int i=0; i<=10; ++i){
mylist.push_back(i);
}
mylist.show_list();
List<char> charlist;
for(int j=66; j<75; ++j){
charlist.push_back(j);
}
charlist.show_list();
}
三、注意事项
对于类模板有些编译器不支持头文件和源文件分开编译,如VC6.0,有些编译器支持,所以在编译时需要针对不同情况进行设计,如果不支持,就将所有的内容放在头文件中即可。
- 类模板(十七)
- 【十七】类模板(上)
- OpenCV学习笔记(十七)模板匹配
- 《C++ primer》学习笔记之二十七:当模板参数是另一个模板类的实例时写法要注意
- python 专题十七 类
- (十七)文件类
- 十七
- 十七
- 十七
- C++11 理解 (十七) 之 变长参数模板
- Vuejs学习系列(十七)--模板语法(三)
- Ecshop模板开发(十七):商城页面底部帮助信息
- (二十七)、枚举类
- 第二十七节 java学习 Hashtable类
- java基础整理十七(常用工具类)
- 十七、类与对象:UML简介
- Liferay研究之十七:由Velocity模板的国际化问题引出的“大秘密”
- 我的php学习笔记(二十七)PHP模板引擎Smarty缓存应用
- TensorFlow简明入门宝典
- JS之正则表达式-yellowcong
- centos7 修改默认ssh端口 22
- 芯片测试的几个术语及解释(CP、FT、WAT)
- 深度学习有开源代码的文献
- 类模板(十七)
- C#多线程基础,适合新手了解
- UnityEvent 中Invoke()方法
- 未来的智能商业:BI商务智能分析系统将融合其他技术
- 简单的js路由跳转
- Java单元测试(Junit+Mock+代码覆盖率)
- javascript dom编程艺术读书笔记之图片库改进版
- Java中常见排序
- Angular4记账webApp练手项目之五(Angular4项目中创建service(服务)和使用http模块)