C++模板类[初步]
/*
* stacktp.h
*
* Created on: 2014年3月29日
* Author:
*/
/**
* - 模板类的概念,与使用
* -# export template <class Type>
* <li> export 关键字表示导出这个模板类,使用此关键,使得可以把
* 模板类的声明放在头文件中,而定义分开放在.cpp的文件中.
* 有些编译器没有实现此关键字,因此必须把定义与声明放在头文件中
* 否则编译通不过
* </li>
* <li> template 关键字,表示声明一个模板类</li>
* <li> <class Type> 表示要传给这个模板类的参数
* class 这个关键字,表示参数的类型,这个关键字可以用 Typename这个关键字替代
* Type 是参数的名字,也即变量名.C++习惯上用T表示
* 关键理解:
* 我们要抓住:"模板"和"模板类"这两个概念. 有句话叫:依葫芦画飘瓢。意思是说按照葫芦的样子画瓢。
* 用来类比的话就是说"模板"对应那个葫芦,"类"对应那个瓢.同理,模板类的意思是告诉C++编译器按
* 照模板类来生成具体的类代码。具体的类代码的函数和算法是相同的,不同的部分就是 <class Type>
* 指定的那部分,这部分是编译器要按照我们使用时指定的参数的不同,编译时生成相应的代码,不再需要
* 手写和粘贴复制了.编译器在帮程序员偷懒(从小的角度来看),提高一个层次来看,就叫通用编程.就是说
* 编写一段通用的代码,传入什么的样的参数,就生成相应用的具体代码。从数学的角度来说,就是写了一个
* 公式或者说函数;不同的取值范围和具体的量化,产生不同的结果。比如y=a+k(x),假如a,k是常量,根据x
* 的取值不同,相应的y也不同。从这里来理解,用模板写一些算法性质的代码,那简值太妙了,特别是一些常用的
* 算法,可以少死很多脑细胞.
* </li>
* -此类来自于C++ primer Plus(第五版)第14章
* -# 模拟实现一个堆栈,栈空间最大为10
*
*
*/
#ifndef STACKTP_H_
#define STACKTP_H_
// export template <class Type>
template <class Type>
class Stack
{
private:
enum{MAX =};
Type items[MAX];
int top;
public:
Stack();
bool isempty();
bool isfull();
bool push (const Type & item);
bool pop (Type & item);
}; /**
*下面的书写形式,要讲一下
*template <class Type> //这一部分参考头文件的说明
* Stack<Type>::Stack()//这里要说一下
* Stack :表示模板类的类名
* <Type>:表示传给这个模板类的类型类参数,
* 编译器根据它的意思来生成具体的代码.如终强调一点,我们写的是
* 模板代码。注意"模板"两字。
* ::Stack():表示是Stack<Type>这个模板类的构造方法.
* 回固一下知识。如果我们自己写了构造函数。那么C++编译器,就不会在编译时偷偷的生成默认构造函数了.
*
*/
template <class Type>
Stack<Type>::Stack()
{
top =;
} template <class Type>
bool Stack<Type>::isempty()
{
return top == ;
} template <class Type>
bool Stack<Type>::isfull()
{
return top == MAX;
} template <class Type>
bool Stack<Type>::push(const Type &item)
{
if(top < MAX){
items[top++] = item;
return true;
}
else{
return false;
}
} template <class Type>
bool Stack<Type>::pop(Type & item)
{
if(top>){
item = items[--top];
return true;
}
else{
return false;
}
} #endif /* STACKTP_H_ */
//============================================================================
// Name : TemplateClass_1.cpp
// Author :
// Version :
// Copyright : Free
// Description : Hello World in C++, Ansi-style
//============================================================================ #include <iostream>
#include <cstring>
#include <cctype>
using namespace std;
#include "stacktp.h" int main() { /**
* 注意:[1]
* 我们传了std::string这个类型给Stack模板类
* 编译器是如何知道Stack是个模板类呢,或者说我们是如何确
* Stack是个模板类呢,而不是普通的类呢。注意"<>"这对尖括号
* 它表示类Stack还要接受一个类型参数,所以我们从这里确定的。
* 编译器也是通过<>来识别的。我们其实可以想象普通的非模板类,
* 也有一对尖括号的,也接受了一个参数,只是这个参数在非模板类
* 的定义里面没有用到,没有使用这个参数,所以传了也没有用。
* 这样一想,可以在概念上把非模板类和模板类统一认为是模板类了。
* 非模板类,是模板类的一个子集。
* 注意:[2]
* Stack<std::string> st; //这里虽然只写了一句,但实际编译后不只是这句话,
* 而是如下一段代码:
* Stack<std::string> st = new Stack();
* 但是这里有个前提条件,我们必须有一个默认构造函数,否则C++编译器不知道,怎样
* 初始化这个st对象。而报语法错误.
* 而在Java中,定义的对象都是引用。必须要new才会初始化.
* 因此我们要记住一点,在面向对象的世界里,所有的对象都要有初值,要有一个确定的状态.
* 如果允许,对象有不确定的状态,那么就没有那么了...
*
*/ Stack<std::string> st;
char ch;
std::string po;
cout <<"Please enter A to add a purchase order,\n"
<< "P to process a PO,or Q to quit.\n"; while(cin >> ch && std::toupper(ch)!= 'Q')
{
while(cin.get()!='\n')
continue;
if(!std::isalpha(ch))
{
cout<< '\a';
continue;
}
switch(ch)
{
case 'A':
case 'a':
cout <<"Please Enter a PO number to add:";
cin>>po;
if(st.isfull())
{
cout << "stack already full\n";
}
else
{
st.push(po);
}
break;
case 'P':
case 'p':
if(st.isempty())
{
cout << "stack already empty\n";
}
else
{
st.pop(po);
cout << "PO # "<<po<<" popped\n";
}
break;
}
cout <<"Please enter A to add a purchase order,\n"
<< "P to process a PO,or Q to quit.\n";
} cout<< "Bye\n";
return ;
}
C++模板类[初步]的更多相关文章
- 单链表的C++实现(采用模板类)
采用模板类实现的好处是,不用拘泥于特定的数据类型.就像活字印刷术,制定好模板,就可以批量印刷,比手抄要强多少倍! 此处不具体介绍泛型编程,还是着重叙述链表的定义和相关操作. 链表结构定义 定义单链表 ...
- 模板类 error LNK2019: 无法解析的外部符号
如果将类模板的声明和实现写在两个独立的文件中,在构建时会出现"error LNK2019: 无法解析的外部符号 "的错误. 解决方法有: 第一种方法,就是把类模板中成员函数的声明和 ...
- 关于g++编译模板类的问题
今天搞了我接近4个小时,代码没错,就是调试没有通过,无论怎么也没有想到是编译器的问题 g++不支持c++模板类 声明与实现分离,都要写到.h文件里面. 以后记住了.
- C++11特性(模板类 initializer_list)
[1]initializer_list模板类 C++primer 原文如下: 通读原文相关篇幅,分析解读内容如下: 提供initializer_list类的初衷,为了便于将有限个同一类型(或可转换为同 ...
- C++11模板类使用心得
1.推荐使用std::shared_ptr<TaskT>代替指针TaskT*使用,shared_ptr是一种智能指针,能自主销毁释放内存,在c++11中被引入,在多线程编程中有很大的用处, ...
- c++模板类
c++模板类 理解编译器的编译模板过程 如何组织编写模板程序 前言常遇到询问使用模板到底是否容易的问题,我的回答是:“模板的使用是容易的,但组织编写却不容易”.看看我们几乎每天都能遇到的模板类吧,如S ...
- C++ 模板函数与模板类
一.模板函数 函数模板提供了一类函数的抽象,即代表了一类函数.当函数模板被实例化后,它会生成具体的模板函数.例如下面便是一个函数模板:
- 模板类重载<<运算符
写了一个Matrix模板类,需要重载<<, 1.需要友元函数 2.需要此函数的实现在.h中(本人试验出来的,放在.cpp中编译不通过) template <typename T> ...
- C++模板类的使用
1.定义模板类 通过类似于下面的语法可以定义一个模板类: template<typename T> class Job : public virtual RefBase { public: ...
随机推荐
- 2017.6.30 IDEA插件--gsonfomat的安装与使用
参考来自:http://www.cnblogs.com/1024zy/p/6370305.html 1.安装 2.使用 (1)新建一个空类 (2)在空类里按快捷键:alt+s,打开gsonformat ...
- 转:提高ios通过率的注意点
http://bugly.qq.com/bbs/forum.php?mod=viewthread&tid=431 Bugly 技术干货系列内容主要涉及移动开发方向,是由 Bugly 邀请腾讯内 ...
- ZOJ1157, POJ1087,UVA 753 A Plug for UNIX (最大流)
链接 : http://acm.hust.edu.cn/vjudge/problem/viewProblem.action? id=26746 题目意思有点儿难描写叙述 用一个别人描写叙述好的. 我的 ...
- ant安装配置
点击进入ant官网,找到下载选项. 选择下载安装文件.其余的源文件和手册的下载步骤完全相同. 可以下载官网上对应系统的最新版本.也可以在old ant 版本中选择自己需要的版本.笔者需要ant-1.9 ...
- 页面加载后累加,自加1&&判断数字是否为两位数
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- 系统封装 如何为原生PE集成软件
1 我们首先集成Explorer.老外的BSExplorer比较好用,下载之后得到这些文件,不算太大. 2 这里需要注意,前一章讲解如何打造原生PE已经制作成了ISO,这里想要集成软件还需要回到刚 ...
- Codeforces #263 div2 解题报告
比赛链接:http://codeforces.com/contest/462 这次比赛的时候,刚刚注冊的时候非常想好好的做一下,可是网上喝了个小酒之后.也就迷迷糊糊地看了题目,做了几题.一觉醒来发现r ...
- Laravel的本地化
一.简介 Laravel 的本地化功能提供方便的方法来获取多语言的字符串.语言包存放在 resources/lang 文件夹的文件里.在此文件夹内应该有网站对应支持的语言并将其对应到每一个子目录: / ...
- mysql_affected_rows的注意点
取得最近一次与 link_identifier 关联的 INSERT,UPDATE 或 DELETE 查询所影响的记录行数. 1.执行成功,则返回受影响的行的数目,如果最近一次查询失败的话,函数返回 ...
- 【HTML5】交互元素menu&command元素
1.交互元素<menu> 1.1源码 <!DOCTYPE html> <html> <head> <meta charset="utf- ...