小技巧:C++限制一个方法只能在某个类当中被调用

本文介绍了一种使用C++模板和友元机制来限制类A的方法func1仅能在特定类B中被调用的方法。通过定义一个带有模板参数的FriendAccess类,并将其构造函数设为私有,以此确保只有类B能够构造FriendAccess实例并调用A的func1方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一个类A有方法func1,有时候我们希望这个func1只在某个特定的类B中被调用。以下是一种实现方法:

template<class T>
class FriendAccess
{
   friend typename T; 
// error if write class keyword instead of typename here, but okay if typename is ignored, why?
   FriendAccess();
}
;

class B; // forward declaration
class A
{
public:
   
void fun1(FriendAccess<B> fb) const
   
{
      cout 
<< "invoke legally" << endl;
   }
;
}
;
class B
{
public:
   
void invoke(A* pa) const
   
{
      
if (pa)
         pa
->fun1(FriendAccess<B>());
   }

}
;

因为FriendAccess的ctor被声明为private,所以其只能在template的type param中被构造,A的func1中指定了这个type param只能是B,也就将A::func1的调用范围限定在了B内部。主要原理还是利用了模板和友元的结合。

不过这里比较诡异的是FriendAccess中如果我写friend class T,编译的时候(测试用的是vc2005)居然还是说FriendAccess的ctor无法访问,必须写成typename。然而如果我再写一个特化的FriendAccess<B>版本,其中直接写friend class B,就ok了,诡异!哪位能分析下?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值