c/c++ 类模板初探
类模板
1,模板类里的函数都是模板函数
2,模板类里的函数,在类外面实现的时候,要用模板函数(方法:push_back)的方式实现,在类内部实现时,不需要用模板函数(方法:show)方式实现。
3,用模板类实现单链表,类List是类ListNode的友元类;用友元函数重载了类Value的<<函数;显示链表的show方法在类外面定义的部分注释掉了。
4,在gcc4.8.5-20下,如果把ListNode和List的声明放到.h文件,把实现放在.cpp后,编译无法通过。但是把ListNode和List的声明和实现都放到.h文件,就可以编译通过。完整代码
编译方法:g++ -g template_main.cpp
分割线==============
下面的例子,为了简单起见,都放到了一个cpp文件了。
#include <iostream>
using namespace std;
template<typename A>
class List;
//节点
template<typename A>
class ListNode{
  friend class List<A>;
public:
  ListNode():data(A()), next(NULL){}
  ListNode(A a, ListNode *n) : data(a), next(n){}
private:
  A data;
  ListNode *next;
};
//单链表
template<typename A>
class List{
public:
  List();
  //尾插
  bool push_back(A val);
  //显示链表
  void show()const{
    ListNode<A> *n = first->next;
    while(NULL != n){
      cout << n->data;
      n = n->next;
    }
    cout << "NULL" << endl;
  }
private:
  ListNode<A> *first;
  ListNode<A> *last;
  size_t size;
};
template<typename T>
List<T>::List(){
  first = last = new ListNode<T>;
  last->next = NULL;
  size = 0;
}
//尾插
template<typename A>
bool List<A>::push_back(A value){
  ListNode<A> *node = new ListNode<A>;
  if(NULL == node) return false;
  node->data = value;
  node->next = NULL;
  last->next = node;
  last = node;
  size++;
  return true;
}
//显示链表
/*
template<typename A>
void List<A>::show()const{
  ListNode<A> *n = first->next;
  while(NULL != n){
    cout << n->data;
    n = n->next;
  }
  cout << "NULL" << endl;
}
*/
class Value{
  friend ostream& operator<<(ostream &o, const Value &v);
public:
  Value(int d = 0) : value(d){}
private:
  int value;
};
ostream& operator<<(ostream &o, const Value &v){
  o << v.value << "->";
  return o;
}
int main(){
  List<Value> l;
  for(int i = 0; i < 10; ++i){
    l.push_back(Value(i));
  }
  l.show();
}
c/c++ 类模板初探的更多相关文章
- c++类模板初探
		#include <iostream> #include <string> using namespace std; // 你提交的代码将嵌入到这里 ; template &l ... 
- 28.C++- 单例类模板(详解)
		单例类 描述 指在整个系统生命期中,一个类最多只能有一个实例(instance)存在,使得该实例的唯一性(实例是指一个对象指针) , 比如:统计在线人数 在单例类里,又分为了懒汉式和饿汉式,它们的区 ... 
- 智能指针类模板(上)——STL中的智能指针
		智能指针类模板智能指针本质上就是一个对象,它可以像原生指针那样来使用. 智能指针的意义-现代C++开发库中最重要的类模板之一-C++中自动内存管理的主要手段-能够在很大程度上避开内存相关的问题 1.内 ... 
- C++中的单例类模板
		1,本节课讲述单例类模式,实现并抽取相关代码实现单例类模板,在以后开发工作 中,如果想要使用单例模式,那么直接使用今天开发的单例类模板就可以: 2,需求的提出: 1,在架构设计时,某些类在整个系统生命 ... 
- C++中的智能指针类模板
		1,智能指针本质上是一个对象,这个对象可以像原生的指针一样使用,因为智能指 针相关的类通过重载的技术将指针相关的操作符都进行了重载,所以智能指针对象可以像原生指针一样操作,今天学习智能指针类模板,通过 ... 
- C++STL - 类模板
		类的成员变量,成员函数,成员类型,以及基类中如果包含参数化的类型,那么该类就是一个类模板 1.定义 template<typename 类型形参1, typename 类型形参2,...&g ... 
- C++ 类模板的使用
		从事C++挺久了,在前段时看书时,发现高手,都是在写模板无,泛型编程,顿感差距.自己连模板都没有写,于是就小小的研究了下模板的用法. 模板简而言之就是对某此对象的相同方法,或处理方式,进行归纳,总结, ... 
- Xcode6中如何使用自定义的类模板
		说到IOS类的模板,有些人感觉很陌生,但是只要有开发过IOS程序的人,其实都用过类的模板,只不过是用的系统自带的类的模板. 例如创建一个ClassTemplateVC继承于UIViewControll ... 
- VS2013,VS2015设置类模板文件表头
		一般VS的类模板文件是放在C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\IDE\ItemTemplatesCache\CSha ... 
随机推荐
- WEB安全之垃圾信息防御措施
			防止垃圾评论与机器人的攻击手段如下: 1)IP限制.其原理在于IP难以伪造.即使是对于拨号用户,虽然IP可变,但这也会大大增加共攻击的工作量. 2)验证码.其重点是让验证码难于识别,对于“字母+数字” ... 
- PHP接口的思考
			其中就有一个SPL(标准PHP库)的尝试,SPL中实现一些接口,其中最主要的就是Iterator迭代器接口,通过实现这个接口,就能使对象能够用于foreach结构,从而在使用形式上比较统一.比如SPL ... 
- dubbo源码解析五 --- 集群容错架构设计与原理分析
			欢迎来我的 Star Followers 后期后继续更新Dubbo别的文章 Dubbo 源码分析系列之一环境搭建 博客园 Dubbo 入门之二 --- 项目结构解析 博客园 Dubbo 源码分析系列之 ... 
- 安装haproxy和haproxy命令
			HaProxy系列文章:http://www.cnblogs.com/f-ck-need-u/p/7576137.html 1.安装haproxy CentOS自带了haproxy,但可能版本比较老. ... 
- Docker数据卷Volume实现文件共享、数据迁移备份(三)--技术流ken
			前言 前面已经写了两篇关于docker的博文了,在工作中有关docker的基本操作已经基本讲解完了.相信现在大家已经能够熟练配置docker以及使用docker来创建镜像以及容器了.本篇博客将会讲解如 ... 
- .NET记录-获取外网IP以及判断该IP是属于网通还是电信
			在工作时,需要获取服务器公网IP(外网IP),并且判断该IP地址是属于网通还是电信.花时间整理一下,自己实现的代码,以及后续遇到的问题. /// <summary> /// 获取外网IP ... 
- [转]Node.js中koa使用redis数据库
			本文转自:https://blog.csdn.net/offbye/article/details/52452322 Redis是一个常用的Nosql数据库,一般用来代替Memcached做缓存服务, ... 
- 第一册:lesson forty five。
			原文: The boss's letter. A:Can you come here a minute please,Bob? B:Yes,sir. A:Where is C? B:She is ne ... 
- linux磁盘管理增加,扩容
			一.磁盘空间不足,添加新的磁盘 一般来说,当我们在服务上插入新的磁盘时,服务器是会对磁盘进行识别的.但是,有的时候服务器并没有对这些新插入的磁盘进行识别.这时,我们可以通过重启服务器,来使服务器重新加 ... 
- 【Spring】31、Spring的EL表达式
			一.简介 Spring3中引入了Spring表达式语言—SpringEL,SpEL是一种强大,简洁的装配Bean的方式,他可以通过运行期间执行的表达式将值装配到我们的属性或构造函数当中,更可以调用JD ... 
