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