模板友元类

友元类

让某个类B称为另外一个类A的友元类,这样的话,类B就可以在其成员函数中访问类A的所有成员不管这些成员在类A中是用什么(public,protected,private)来修饰的。
如果现在类A和类B都变成了类模板,那么能否让类模板B成为类模板A的友元类模板呢?

让类模板的某个实例(具体的类)成为友元类

template <typename U> class B;  -- 类模板B的声明
 
template <typename T>
class A
{	
	friend class B<long>;     -- 不需要任何public,private等修饰符。
private:
	int data;
};
 
template <typename U>
class B
{
public:
	void callBAF()
	{
		A<int> atmpobj;
		atmpobj.data = 5;
		cout << atmpobj.data << endl;
	}
};
  • 调用:
B<long> bobj;
bobj.callBAF();  // 5
  • 让类模板B特定的实例成为了类模板A的友元类。

让类模板成为友元类模板

template <typename T>
class A
{	
	template<typename> friend class B;
private:
	int data;
};
 
template <typename U>
class B
{
public:
	void callBAF()
	{
		A<int> atmpobj;
		atmpobj.data = 5;
		cout << atmpobj.data << endl;
	}
};
  • 调用:
B<long> bobj1;
B<int> bobj2;
bobj1.callBAF();  //5
bobj2.callBAF();  //5

让类型模板参数成为友元类

C++11新标准中引入:如果传递进来的 类型模板参数 是一个类类型,则这个类类型可以成为当前类模板的友元类。

template <typename T>
class A2
{
	friend T;
private:
	int data;
};
 
class CF
{
public:
	void callCFAF()
	{
		A2<CF> aobj1;    -- 让CF类成为了A2
		aobj1.data = 12;
		cout << aobj1.data << endl;
 
	}
};
  • 调用:
CF mycfobj;
mycfobj.callCFAF();
  • 输出:
 12
  • 代码行A2 aobj1; 的效果是让CF类成为了A2类的友元类;
  • 于是,在CF类的成员函数中(不是在其他域,如主函数中),可以直接访问aobj1这个A2类对象的data私有成员变量
    • 如在main函数中直接访问A私有成员,编译报错
A2<_nmsp2::CF> aobj1;
aobj1.data = 12;
  • 如果传递给类模板A2的类型模板参数不是一个类类型,那么代码行friend T;就会被忽略。
template <typename T>
class A2
{
	friend T;
private:
	int data;
};
 
class CF
{
public:
	void callCFAF()
	{
-- 因为CF类并不是A2<int>的友元类,自然不能在这里访问aobj2这个A2<int>类对象的data私有成员变量。
		A2<int> aobj2; 
		aobj2.data = 15;
		cout << aobj2.data << endl;
	}
};
  • 调用报错:
CF mycfobj;
mycfobj.callCFAF();

增加 friend class CF;则将整个CF类作为友元类

template <typename T>
class A2
{
	friend T;
	friend  class CF;
 
private:
	int data;
};
 
class CF
{
public:
	void callCFAF()
	{
		A2<CF> aobj1;     //让CF类成为了A2<CF>
		aobj1.data = 12;
		cout << aobj1.data << endl;
 
		A2<int> aobj2; 
		aobj2.data = 15;
		cout << aobj2.data << endl;
	}
};
  • 调用:
CF mycfobj;
mycfobj.callCFAF();
  • 输出:
12
15
 
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
当我们声明一个类模板时,有时候我们需要让某个类能够访问到这个模板类的私有成员或保护成员。这时我们就可以使用友元类来实现。 下面是一个声明类模板友元类的示例代码: ``` template<typename T> class MyTemplateClass { friend class MyFriendClass; public: MyTemplateClass(T value); private: T m_value; }; template<typename T> MyTemplateClass<T>::MyTemplateClass(T value) : m_value(value) {} class MyFriendClass { public: template<typename T> void printValue(const MyTemplateClass<T>& obj) { std::cout << "The value is: " << obj.m_value << std::endl; } }; int main() { MyTemplateClass<int> obj(42); MyFriendClass friendObj; friendObj.printValue(obj); return 0; } ``` 在这个示例代码中,我们声明了一个类模板`MyTemplateClass`,并且声明了一个友元类`MyFriendClass`。通过`friend class MyFriendClass;`语句,我们将`MyFriendClass`声明为`MyTemplateClass`的友元类,这意味着`MyFriendClass`可以访问到`MyTemplateClass`的私有成员或保护成员。 在`MyFriendClass`中,我们定义了一个模板函数`printValue`,该函数接受一个`MyTemplateClass`类型的对象作为参数,并打印出这个对象的私有成员`m_value`。在`main`函数中,我们实例化了一个`MyTemplateClass`对象,并创建了一个`MyFriendClass`对象`friendObj`,然后通过`friendObj.printValue(obj)`调用了`MyFriendClass`的`printValue`函数,输出了`MyTemplateClass`对象的私有成员值。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

丁金金

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值