首页 新闻 会员 周边

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

0
悬赏园豆:20 [已解决问题] 解决于 2020-12-15 16:48

代码的要求是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 }
Yuzero的主页 Yuzero | 菜鸟二级 | 园豆:218
提问于:2019-10-25 17:41
< >
分享
最佳答案
0

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

收获园豆:20
fenggwsx | 菜鸟二级 |园豆:269 | 2020-07-10 17:13

引用确实可行,这篇文章只是为了找人一起努力而已,兄弟能不能留个联系方式?

Yuzero | 园豆:218 (菜鸟二级) | 2020-12-15 16:49
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册