类模板中出现3种友元声明,每一种友元声明了与一个或者多个实体的友元关系
(1)普通非模板类或函数的友元声明,将友元关系授予明确指定的类或函数。
(2)类模板或函数模板的友元声明,授予对友元所有实例的访问权。
(3)只授予对类模板或函数模板的特定实例的访问权的友元声明。
1 普通友元
非模板类或非模板函数可以是类模板的友元。
#include <iostream>
using namespace std;
template <class Type> class Bar{
//普通非模版类
friend class FooBar;
//普通非模版函数
friend void fun();
private:
Type data;
public:
void setData(Type temp){
data = temp;
}
};
class FooBar{
public:
//非模版类成员可以访问Bar类实例的任意成员
void print(){
Bar<int> bari;
bari.setData(5);
cout<<"data:"<<bari.data<<endl;
Bar<string> bars;
bars.setData("No");
cout<<"data:"<<bars.data<<endl;
}
};
//非模版函数可以访问Bar类实例的任意成员
void fun(){
Bar<int> bari;
bari.setData(4);
cout<<"data:"<<bari.data<<endl;
Bar<string> bars;
bars.setData("Yes");
cout<<"data:"<<bars.data<<endl;
}
int main(){
fun();
FooBar fooBar;
fooBar.print();
return 0;
}
以上代码说明FooBar的成员和fun函数可以访问Bar类的任意实例的private成员和protected成员
2 一般模版友元关系
友元可以是类模版或者函数模版
#include <iostream>
using namespace std;
template <class Type> class Bar{
//模版类
template <class T> friend class FooBar;
//模版函数
template <class T> friend void fun(const Bar<T>&);
private:
Type data;
public:
void setData(Type temp){
data = temp;
}
};
template <class T> class FooBar{
public:
//模版类成员可以访问Bar类实例的任意成员
template <class U> void print(Bar<U> &bar){
cout<<"模版类:"<<bar.data<<endl;
}
};
//模版函数可以访问Bar类实例的任意成员
template <class T> void fun(const Bar<T> &bar){
cout<<"模版函数:"<<bar.data<<endl;
}
int main(){
Bar<int> bari;
bari.setData(4);
Bar<string> bars;
bars.setData("Yes");
fun(bari);
fun(bars);
FooBar<int> fooBari;
FooBar<string> fooBars;
fooBari.print(bari);
fooBars.print(bars);
return 0;
}
一般模板友元关系:FooBar的任意实例都可以访问Bar的任意实例的私有成员。fun函数相同。
3 特定的模版友元
除了将一个模版的实例设为友元,类也可以只授予对特定实例的访问权。
#include <iostream>
using namespace std;
//模版声明
template <class T> class Bar;
template <class T> class FooBar;
template <class T> void fun(const Bar<T>&);
template <class Type> class Bar{
//模版类特定实例
friend class FooBar<int>;
//模版函数特定实例
friend void fun<int>(const Bar<int>&);
private:
Type data;
public:
void setData(Type temp){
data = temp;
}
};
template <class T> class FooBar{
public:
template <class U> void print(Bar<U> &bar){
cout<<"模版类:"<<bar.data<<endl;
}
};
template <class T> void fun(const Bar<T> &bar){
cout<<"模版函数:"<<bar.data<<endl;
}
int main(){
Bar<int> bari;
bari.setData(4);
Bar<string> bars;
bars.setData("Yes");
fun(bari);
//fun(bars); error:Type data is private
FooBar<int> fooBari;
FooBar<string> fooBars;
fooBari.print(bari);
//fooBars.print(bars); error:Type data is private
return 0;
}
分享到:
相关推荐
关于c+模板之友元类友元函数的实例化,图形界面之矩形。
这里讲述的是c++类模板中的友元声明及模板构造函数的说明,具体操作请看面的内容 类模板的友元声明: 当授予给定模板的所有实例的访问权的时候,在作用域中不需要存在该类模板或函数模板的声明。想要限制对...
15 模板-类模板与友元
实例讲解C++友元,利用实例讲解C++友元的知识
模板类友元函数的一个源代码例子。
本文档详细介绍了C++友元函数及友元类,方便大家对比学习
如何声明和创建友元类 简单友元类的声明,C++中友元类的应用范围
用vc++友元类程序的编写。程序用vc++6.0开发,其中关于年月份的判断相对前面,程序简单易懂。
简单的友元类使用,自己编的c++程序,可以作为模板。
这是关于C++中、如何将普通函数声明友元函数的、求间隔日期的例子。适用于C++初学者学习用。
主要讲解c++种的友元类友元函数 可以更好地学习其中的内容 友元在类中担任着十分关键的角色 所以更应该认真学习
全面讲解C++友元知识,更加详细的讲述C++中友元机制,还配有代码讲解,十分详细!
C++静态成员、友元函数、类模板实验,共3个任务
一 友元 类似 java 中享元模式:实例的共享(ImageLoader Lru 算法 存储图片) ...友元:类或函数的共享 优点:提高效率、表达清晰 缺点:破坏封装性 特征: 友元函数不能被派生类继承 友元函数不能使用this
一个类A声明为一个类B的友元类之后,类A就可以任意访问类B的。。。
单链表的类模板实现,运用友元模板函数对列表进行排序 C++程序设计教程面向对象第七章课后题代码 类模板 函数模板 嵌套 友元函数
C++ 类的继承友元模版举例
C++第六章 静态成员与友元.ppt
C++学习笔记和常见面试知识点,C++11特性,包括多态、虚表、移动语义、友元函数、符号重载、完美转发、智能指针、const和static、数组指针和指针数组、struct内存对齐、enum和union关键字等等。帮助了解C++的特性,...