友元
友元为类外的函数,和其他类的成员函数提供了一种可以访问类内私有变量的方式。
友元函数
如果一个函数想访问类中的私有成员变量,那他得先被声明为该类的友元(friend
+ 函数声明)。友元函数并非是类的函数成员,所以它不受说在区域访问控制级别的限制,但是一般声明在public:
,声明之前。
要注意,友元声明并不是声明,所以最好还在类所在的头文件之外进行第二次声明(然后顺理成章的和类的成员函数们定义在一起)。
再者,友元函数的定义可以写在类内部,以实现隐式内联。即便如此也得在类外再次声明。
Problem
问题描述:已知可以将类或者类内成员函数声明为友元,比如将classA声明为classB的友元,假设他们有单独的头文件,classA在声明classB的友元函数时,必须得知道classB存在,而classB在将classA声明为它的友元时,也得早知道classA存在,那他们的头文件该如何
#include
?
//classA.h
class classB;
class classA
{
void funcfriendB(classB Pro1);
}
在classA
的头文件中,对于友元函数funcfriendB()
而言,仅仅是存在声明,并不定义,也就不会有关于classB
中数据访问的内容,所以在classA
的头文件中只需要声明classB是个啥就行:class classB;
//classA.c
#include "classB.h"
void classA::funcfriendB(classB Pro1)
{...}
但是在classA
的实现时,因为要访问类中数据,所以这时就要#include"classB.h"
//classB.h
#include"classA.h"
class classB
{
friend class classA;
//friend void classA::funcfriendB(classB Pro1);
}
这里要#include"classA.h"
以为友元类classA
和友元函数funcfriendB()
提供声明 。
这样就可以避免因为头文件互相包含导致的重定义问题。