友元的一点笔记

如果A类的成员函数成为B类的友元成员函数,并且在A类的成员函数里面有B类的引用。则必须小心排列类声明和类定义的顺序。

因为A类的成员函数有B类的引用,所以编译器必须先看到B类的声明。但是A类的成员函数又是B类的友元成员函数,所以编译器必须看到A类的定义,形成一个死循环。因此,对B类使用前向声明(forward declaration),让编译器知道B类的定义稍后提供。

class B   //forward declaration
{
      friend void A::method( B &b);
      ........
};

class B;
class A
{........};
class B
{........};

如果此时A类中的成员函数通过B类的引用,调用B类的成员函数,编译器此时必须知道B类的成员函数的定义,那么此时A类的成员函数定义就不能放在A类的定义中,必须将定义放在B类的定义之后。

如下

class B;
class A
{........};
class B
{........};
inline void A::method(B &b) {return b.method();}

内联函数的链接性是文件内部,故内联函数的定义必须在使用该函数的文件中。


如果A类的成员函数使用B类的对象,那么A类的成员函数必须知道B类的定义,如果不知道。那么A类的成员函数必须在B类定义之后才能定义。

class A
{
       friend class B;
 public:
       void method1( B &b);
       .......
};
class B
{
        friend class A;
        void bool method2( A &a){a.method3();}
         ......
};
inline  void A::method1(B &b)
{
      ......
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值