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成员的权限. 比方: ...
随机推荐
- python三大神器之fabric(2.0新特性)
fabric经常出现在自动化运维领域,批量处理一些运维工作.fabric是在paramiko之上又封装了一层,操作起来更加简单易用. 本来只是想写个博客记录一下,然后发现之前写的代码不能运行了,报以下 ...
- 详细分析MySQL的日志(一)
官方手册:https://dev.mysql.com/doc/refman/5.7/en/server-logs.html 不管是哪个数据库产品,一定会有日志文件.在MariaDB/MySQL中,主要 ...
- Python系列:四、Python函数--技术流ken
Python函数 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段. 函数能提高应用的模块性,和代码的重复利用率.你已经知道Python提供了许多内建函数,比如print().但你也可 ...
- MySQL系列详解十:MySQL多源复制演示-技术流ken
前言 多源复制即多主一从结构,多个主服务器端的数据都会同步到后端一个从服务器上面.至于为什么要做多源复制下面的总结很到位. 1.灾备作用:将各个库汇总在一起,就算是其他库都挂了(整个机房都无法连接了) ...
- C# Redis安装 使用教程
前言:lz自打工作以来第一次遇到电脑问题需要重装系统,全盘格式化.打击是沉痛的.特别伤. 然后需要重新在本地部署 redis.这是写这篇博客的原因.希望对大家有所帮助,安装资源和引用DLL可以引用 ...
- WPF 自定义Command
无参Command: internal class DelegateCommand : ICommand { private readonly Action _execute; private rea ...
- ABP框架 sql语句(转载)
ABP.Core实现SQL语句仓储,支持EF.Core兼容的数据库 来源:https://blog.csdn.net/qq_28699537/article/details/80522680?tds ...
- [PHP]算法-二进制中1的个数的PHP实现
二进制中1的个数: 输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示. 思路: 1.右移位运算>> 和 与运算& 2.先移位个然后再与1 &运算为1的就是1 ...
- C-Linux_毫秒级随机值获取
秒级随机值-常用方法: #include <stdlib.h> #include <stdio.h> #include <stdio.h> #include < ...
- Spring Boot从入门到精通之:二、Spring Boot整合JPA
springboot-jpa 开发工具 系统: windows10 开发工具: Intellij IDEA 2018.2.6 springboot: 2.0.6.RELEASE jdk: 1.8.0_ ...