c++ 模板类的 友元函数
#pragma once
#include <iostream> template <class T>
class stack
{
template <class Ty>
friend std::ostream& operator<<(std::ostream& os, const stack<Ty>& s);
public:
explicit stack<T>(int maxSize);
stack<T>(const stack<T>& s);
stack<T>(stack<T>&&) = delete;
stack<T>& operator=(const stack& s);
stack<T>& operator=(stack<T>&&) = delete;
~stack<T>(); void push(T e);
bool pop(T& e);
bool getTop(T& e) const; bool isEmpty() const;
int getNumElems() const; private:
T* elems;
int top;
int maxSize;
void overflowProcess();
}; template <class T>
std::ostream& operator<<(std::ostream& os,const stack<T>& s)
{
for (int i = ; i <= s.top; i++)
{
std::cout << s.elems[i] << " ";
}
return os;
} template <class T>
stack<T>::stack(int maxSize_): top(-), maxSize(maxSize_)
{
this->elems = new T[this->maxSize];
} template <class T>
stack<T>::stack(const stack<T>& s)
{
this->top = s.top;
this->maxSize = s.maxSize;
this->elems = new T[this->maxSize];
memcpy_s(this->elems, sizeof(T) * maxSize, s.elems, sizeof(T) * maxSize);
} template <class T>
stack<T>& stack<T>::operator=(const stack& s)
{
if (this == &s) return *this;
if (this->elems != nullptr)delete[] elems;
this->top = s.top;
this->maxSize = s.maxSize;
this->elems = new T[maxSize];
memcpy_s(this->elems, sizeof(T) * maxSize, s.elems, sizeof(T) * maxSize);
return *this;
} template <class T>
stack<T>::~stack()
{
if (this->elems != nullptr)
delete[] elems;
} template <class T>
void stack<T>::push(T e)
{
if (this->top == maxSize - )
{
overflowProcess();
}
this->elems[++top] = e;
} template <class T>
bool stack<T>::pop(T& e)
{
if (!isEmpty())
{
e = this->elems[top--];
return true;
}
return false;
} template <class T>
bool stack<T>::getTop(T& e) const
{
if (!isEmpty())
{
e = elems[top];
return true;
}
return false;
} template <class T>
bool stack<T>::isEmpty() const
{
return top == - ? true : false;
} template <class T>
int stack<T>::getNumElems() const
{
return top + ;
} template <class T>
void stack<T>::overflowProcess()
{
T* new_elems = new T[maxSize + maxSize / ];
memcpy_s(new_elems, sizeof(T) * maxSize, this->elems, sizeof(T) * maxSize);
delete[] elems;
this->elems = new_elems;
}
代码长;懒得剪。。。。一个具备基本功能的栈类;可以直接使用
里面用到了: 模板友元函数 在类外定义的前面要加上template<class Ty> 以示区分
因此: 模板友元函数:类内定义 无需 template<class Ty> /////其实这个还不确定,下次试试就知道了
类内声明,类外定义:需要tempalte<class Ty>
c++ 模板类的 友元函数的更多相关文章
- c/c++ 模板与STL小例子系列<二> 模板类与友元函数
c/c++ 模板与STL小例子系列 模板类与友元函数 比如某个类是个模板类D,有个需求是需要重载D的operator<<函数,这时就需要用到友元. 实现这样的友元需要3个必要步骤 1,在模 ...
- C++模板类中友元函数的写法
首先,已声明好的类Triangle file://Triangle.h template<class T> class Triangle{ public: Triangle(T width ...
- gcc的bug? c++模板类中友元函数的訪问权限问题
原文地址:http://stackoverflow.com/q/23171337/3309790 在c++中,模板类中能够直接定义一个友元函数.该函数拥有訪问该模板类非public成员的权限. 比方: ...
- C++中模板类使用友元模板函数
在类模板中可以出现三种友元声明:(1)普通非模板类或函数的友元声明,将友元关系授予明确指定的类或函数.(2)类模板或函数模板的友元声明,授予对友元所有实例的访问权.(3)只授予对类模板或函数模板的特定 ...
- C++模板类内友元(友元函数,友元类)声明的三种情况
根据<C++ Primer>第三版16.4节的叙述,C++类模板友元分为以下几种情况 1.非模板友元类或友元函数. 书上给了一个例子: class Foo{ void bar(); ...
- C++学习之友元类和友元函数
C++学习之友元类和友元函数 模板类声明也可以有友元,模板的友元可以分为以下几类: 1.非模板友元: 2.约束模板友元,即就是友元的类型取决于类被实例化的时候的 ...
- sdut 3-7 类的友元函数的应用
3-7 类的友元函数的应用 Time Limit: 1000MS Memory limit: 65536K 题目描写叙述 通过本题目的练习能够掌握类的友元函数的定义和使用方法 要求设计一个点类Poin ...
- C++的友元类和友元函数实例
#include <math.h> #include<iostream> using namespace std; class Point { public: Point(do ...
- mfc 类的友元函数
知识点 友元函数 友元函数 友元函数是指某些虽然不是类成员却能够访问类的所有成员的函数..类授予它的友元特别的访问权.通常同一个开发者会出于技术和非技术的原因,控制类的友元和成员函数(否则当你想更新你 ...
随机推荐
- 图文详解Prometheus监控+Grafana+Alertmanager告警安装使用
一:前言 一个服务上线了后,你想知道这个服务是否可用,需要监控.假如线上出故障了,你要先于顾客感知错误,你需要监控.还有对数据库,服务器的监控,等等各层面的监控. 近年来,微服务架构的流行,服务数越来 ...
- day19 生成器+函数递归
目录 一.yield表达式 1 yield表达式基本用法 二.三元表达式 三.生成式 1 列表生成式 2 字典生成式 3 集合生成式 4 生成器表达式 四.函数的递归 1 递归的定义 2 详解递归 前 ...
- java 面向对象(三十六):泛型五 通配符
1.通配符的使用 /* 通配符的使用 通配符:? 类A是类B的父类,G<A>和G<B>是没关系的,二者共同的父类是:G<?> */ @Test public voi ...
- MySQL基础架构分析
文章已托管到GitHub,大家可以去GitHub查看阅读,欢迎老板们前来Star! 搜索关注微信公众号 码出Offer 领取各种学习资料! MySQL基础架构 一.引言 我们在学习MySQL的时候,迈 ...
- easyui datagrid 中添加combobox
项目需要,如下图所示 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> &l ...
- socket采用epoll编程demo
epoll工作流程 首先,需要调用epoll_create创建epoll: 此后我们就可以进行socket/bind/listen: 然后调用epoll_ctl进行注册: 接下来,就可以通过一个whi ...
- 为什么大家都在用Fiddler?
在我们做接口测试的时候,经常需要验证发送的消息是否正确,或者在出现问题的时候,查看手机客户端发送给server端的包内容是否正确,就需要用到抓包工具.常用的抓包工具有fiddler.wireshark ...
- UC 网盘:我又回来了
普通用户不限速下载,免费 10GB 空间,支持离线下载 这个域名非常厉害,某里挑选域名果然是值得称赞的.直接使用手机号即可注册登录,默认赠送 10GB 空间.不过目前好像没看到有电脑客户端,电脑上下载 ...
- java大数据最全课程学习笔记(5)--MapReduce精通(一)
目前CSDN,博客园,简书同步发表中,更多精彩欢迎访问我的gitee pages 目录 MapReduce精通(一) MapReduce入门 MapReduce定义 MapReduce优缺点 优点 缺 ...
- python环境搭建及配置
我选择的是pycharm,这个对新手比较友好 我目前正在自学周志华的西瓜书,在做练习题3.3时需要用到python来实现,做这个练习需要numpy库和matplot库,最开始的时候忘了anaconda ...