友元的一点笔记

来源:互联网 发布:谁杀了宇智波一族 知乎 编辑:程序博客网 时间:2024/04/29 00:11

如果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){      ......}


原创粉丝点击