首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

友元类有关问题

2014-01-12 
友元类问题 #include iostream23 using namespace std45 class PA67 class A8 {9 public: 10A(void) 1

友元类问题
 #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 }

热点排行