c/c++ 模板与STL小例子系列<二> 模板类与友元函数
c/c++ 模板与STL小例子系列<二> 模板类与友元函数
比如某个类是个模板类D,有个需求是需要重载D的operator<<函数,这时就需要用到友元。
实现这样的友元需要3个必要步骤
1,在模板类D的实现代码的上面声明友元函数
template<typename> class D;//因为友元函数的参数里使用了D,所以要先在这里声明一下
template<typename T>
ostream& operator<< (ostream&, const D<T> &);
2,在模板类D的实现代码里面声明它是我的友元
//注意operator<<后面有<T>
friend ostream& operator<< <T>(ostream& ,const D<T>&);
3,实现友元函数
template<typename T>
//注意operator<<后面没有<T>
ostream& operator << (ostream& out,const D<T>& d){
out << d.x;
return out;
}
例子代码:
#include <iostream>
using namespace std;
template<typename T>
class Test{
public:
Test(T t) : data(t){}
virtual void show() = 0;
private:
T data;
};
template<typename> class D;
template<typename T>
ostream& operator<< (ostream&, const D<T> &);
template<typename T>
class D : public Test<T>{
//注意有<T>
friend ostream& operator<< <T>(ostream& ,const D<T>&);
public:
//注意不是Test(t1)
D(T t1, T t2) : Test<T>(t1), x(t2){}
void show(){
cout << x << ", " << x << endl;
}
private:
T x;
};
template<typename T>
ostream& operator << (ostream& out,const D<T>& d){
out << d.x;
return out;
}
int main(void){
Test<int> *p = new D<int>(10, 21);
p->show();
D<int> d(10,20);
cout << d << endl;
return 0;
}
模板类继承非模板类,非模板类继承模板类
下面的例子没有什么实际意义,只看语法。
#include <iostream>
using namespace std;
class Foo{
public:
Foo(int a, int b, int c) : x(a), y(b), z(c){}
void show(){
cout << x << "," << y << "," << z << endl;
}
private:
int x, y, z;
};
template <typename T>
class Goo : public Foo{
public:
Goo(T t, int a, int b, int c):Foo(a,b,c), data(t){}
void show(){
cout << data << endl;
cout << "Goo show" << endl;
}
private:
T data;
};
class Hoo : public Goo<int>{
public:
Hoo(int a1,int a2,int a3,int a4,int a5):
Goo(a1,a2,a3,a4),ho(a5){}
void show(){
cout << "Hoo show" << endl;
}
private:
int ho;
};
int main(void){
Hoo hoo(1,2,3,4,5);
hoo.show();
Goo<string> goo("abc",1,2,3);
goo.show();
return 0;
}
c/c++ 模板与STL小例子系列<二> 模板类与友元函数的更多相关文章
- c/c++ 模板与STL小例子系列<三> traits
c/c++ 模板与STL小例子系列 traits 对这个概念,还是处于懵逼的状态,初步体会就是,为了解决类型之间的转换问题. 从一个类型为A的指针,转化到类型为B的指针,中间需要用void*来作为中介 ...
- c/c++ 模板与STL小例子系列<一 >自建Array数组
c/c++ 模板与STL小例子系列 自建Array数组 自建的Array数组,提供如下对外接口 方法 功能描述 Array() 无参数构造方法,构造元素个数为模板参数个的数组 Array(int le ...
- C++模板类中友元函数的写法
首先,已声明好的类Triangle file://Triangle.h template<class T> class Triangle{ public: Triangle(T width ...
- python2.7练习小例子(二十九)
29):1.题目:按相反的顺序输出列表的值. #!/usr/bin/python # -*- coding: UTF-8 -*- a = ['one', 'two', 'three'] for ...
- python2.7练习小例子(二十七)
27):题目:一个5位数,判断它是不是回文数.即12321是回文数,个位与万位相同,十位与千位相同. #!/usr/bin/python # -*- coding: UTF-8 -* ...
- python2.7练习小例子(二十八)
28):题目:请输入星期几的第一个字母来判断一下是星期几,如果第一个字母一样,则继续判断第二个字母. 程序分析:用情况语句比较好,如果第一个字母一样,则判断用情况语句或if语句判断第二个字母. ...
- python2.7练习小例子(二十四)
24):1.题目:利用递归方法求5!. 程序分析:递归公式:fn=fn_1*4! #!/usr/bin/python # -*- coding: UTF-8 -*- def fact( ...
- python2.7练习小例子(二十三)
23):题目:求1+2!+3!+...+20!的和. 程序分析:此程序只是把累加变成了累乘. #!/usr/bin/python # -*- coding: UTF-8 -*- n = ...
- gcc的bug? c++模板类中友元函数的訪问权限问题
原文地址:http://stackoverflow.com/q/23171337/3309790 在c++中,模板类中能够直接定义一个友元函数.该函数拥有訪问该模板类非public成员的权限. 比方: ...
随机推荐
- 简单快速的让你的json解析速度快上加快
背景 最近小编在做公司的一个需求.要求是把系统内的一些大型文本文件上传到第三方那里,而且第三方要求的交互数据的方式是采用post请求发送json串的形式进行的. 问题 做到中途才发现问题,由于单个文本 ...
- Mysql加锁过程详解(2)-关于mysql 幻读理解
Mysql加锁过程详解(1)-基本知识 Mysql加锁过程详解(2)-关于mysql 幻读理解 Mysql加锁过程详解(3)-关于mysql 幻读理解 Mysql加锁过程详解(4)-select fo ...
- 深入浅出zookeeper之一:功能及本质
zookeeper(下文简写为zk)大家都不陌生.但是,看到很多同学对zookeeper的理解过于程式化,有些地方甚至需要背,是大可不必的.把本质理解了,概念性和功能介绍都可以推出来的,而且架构要活学 ...
- μC/OS-II 创建一个任务的流程
1. 声明任务的优先级.任务堆栈的大小及任务函数 #define LED_TASK_PRIO 6 #define LED_STK_SIZE 64 void led_task(void *pdata); ...
- DNS域名解析之搭建公司内部域--技术流ken
什么是DNS DNS( Domain Name System)是“域名系统”的英文缩写,是一种组织成域层次结构的计算机和网络服务命名系统,它用于TCP/IP网络,它所提供的服务是用来将主机名和域名转换 ...
- python安装第三方库的最简单方式
一.准备工作 (只做一次准备工作,以后都会很方便) 1. 安装pip (1)下载pip到D:\download pip下载地址:https://pypi.python.org/pypi/pip#dow ...
- CSS定位概述
CSS中有三种基本的定位机制:普通流,浮动和绝对定位. 1.相对定位:relative 如果对一个元素进行相对定位,它将出现在它所在的位置上,然后可以通过设置垂直或者水平位置,让这个元素“相对于” ...
- AvosCloud的文件存储 Demo
时间戳:201310142227 废话少说,直接上代码: package com.dannalapp.main; import com.avos.avoscloud.GetCallback; impo ...
- c# 图片带水纹波动
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...
- C#一个窗体调用另一个窗体的方法
一个窗体调用另一个窗体的方法:例如:窗体B要调用窗体A中的方法1.首先在窗体A中将窗体A设为静态窗体public static FormA m_formA; //设此窗体为静态,其他窗体可调用此 ...