在学习与复习 成员函数做友元 时发现在运用成员函数做友元时c++编译器对代码的结构要求比较严格。想要分享分享我遇到的问题以及我的一些理解,并想知道是否有人能解决这个小问题,我的分析未必正确,欢迎讨论。
定义了两个类GayFriend和building,核心思想是使用 成员函数做友元 使GayFriend能够访问building里的private成员属性bedroom。
当我先对class GayFriend进行声明,再对class building进行定义并声明 友成员函数 时,显然class building能识别class building,但由于未定义或声明class building内的visit() 函数,可能此时编译器是无法识别成员函数visit()的。此时语法上并无错误(我也不懂为何),但此种结构编写是无法让GayFriend访问bedroom的。
此时我想到,是否能在class GayFriend的声明下进行 成员函数visit()的声明 来解决这个问题。
但会出现如上图报错,“成员函数void GayFriend::visit();不可在类外声明”,随后我又将该函数的定义移至类内,同样会出现如图报错。从而得出,成员函数不可在类外声明,但可在类外定义的结论。
因此,得出结论:类1(如图中class GayFriend)中的成员函数作为类2(如图中class building)的友元,要对类2私有成员属性进行访问时,类1必须定义在类2之上,类2逻辑上在类1后,才可成功识别类1中的成员函数,并起到友元访问私有属性的作用。正确结构如图所示:
GayFriend中成员函数可正常访问building中的私有属性bedroom: