C++的友元声明顺序问题

2020-12-15 16:34发布

代码的要求是B中的私有fun作为A的友元函数,能访问A中的私有元素,然后B中要包含A的对象,但是由于友元声明问题,只能声明指向A的指针
我希望能不用指针,而是直接使用A的对象,怎么修改?
如果有学习C++的大佬,交个朋友

 1 #include <iostream>
 2 //声明A,B中要使用A的指针
 3 class A;
 4 class B {
 5     friend class A;
 6 private:
 7     A* pa;//使用指针
 8     void fun();//能访问A中私有成员的函数
 9 public:
10     B();
11     void sss();//调用fun()的接口
12 };
13 //再来定义A,使用友元声明
14 class A {
15 private:
16     int i;
17     int j;
18     friend void B::fun();
19 };
20 
21 void B::fun() {
22     pa->i = 8;
23     std::cout << pa->i << std::endl;
24 }
25 
26 B::B() : pa(new A) {}
27 
28 void B::sss() {
29     fun();
30 }
31 
32 int main()
33 {
34     B b;
35     b.sss();
36     return 0;
37 }

1条回答
对你真心纯属浪费
2楼-- · 2020-12-15 17:16

如果在B中的A要是实例,那么在B实例化的时候A已经完成了实例化了,编译器是从上到下编译的,所以需要把B类的定义放在A类下面,但是A类在实例化的时候要对B类的fun函数设为友元,要知道fun函数的实例才行,而由于为满足前面不用指针的条件,A类首先实例化,它不知道fun函数是什么,综上呢,A的声明要先于B,B的声明又要先于A,这。。。既然是C++,引用型变量不好吗

查看更多
登录 后发表回答