读书人

友元类有关问题

发布时间: 2014-01-12 00:03:16 作者: rapoo

友元类问题
#include <iostream>
2
3 using namespace std;
4
5 class PA;
6
7 class A
8 {
9 public:
10 A(void)
11 {
12 cout << "A()" << endl;
13 }
14
15 ~A(void)
16 {
17 cout << "~A()" << endl;
18 }
19
20 void foo(void)
21 {
22 cout << m_a << endl;
23 }
24
25 friend class PA;
26
27 private:
28 int m_a;
29 };
30
31 class PA
32 {
33 public:
34 PA(A* p) : m_p(p) {}
35
36 ~PA(void)
37 {
38 if (m_p)
39 {
40 delete m_p;
41 m_p = NULL;
}
43 }
44
45 A& operator* (void)
46 {
47 return *m_p;
48 }
49
50 A* operator-> (void)
51 {
52 return m_p;
53 }
54
55 private:
56 A* m_p;
57 };
58
59 int main(void)
60 {
61 PA pa(new A);
62 (*pa).m_a = 10;
63 pa->foo();
64 }
65

这个程序是关于智能指针的。我想使用类PA的对象访问类A的私有成员m_a,就在类A中声明了友元类friend class PA,但编译器直接给我报错,说m_a是类A的私有成员,类PA的对象不能直接访问m_a。请问各位大神,在m_a是类A的私有成员的前提下,怎么使用友元类?

[解决办法]


(*pa).m_a = 10;

A& operator* (void)
{
return *m_p;
}

说白了这和友元毛关系没有,友元是让PA能访问A,但你现在是直接通过一个A的对象访问A的私有成员,怎么可能给你通过
[解决办法]
抛开是设计,就语法来看有两个解决方案:
1. 在A里添加公共方法设置私有成员值 ,通过PA 的->操作符访问该方法。
2. 在PA里添加设置m_p->m_a值得方法,通过PA的.操作符访问该方法。
[解决办法]
59 int main(void)
60 {
61 PA pa(new A);
62 (*pa).m_a = 10;//这是在main函数的作用域,访问A类的 m_a,所以这个成员,必须是public


63 pa->foo(); //这个foo(),也是必须 public
64 }

读书人网 >C++

热点推荐