嵌套类显示成员值

时间:2011-08-09 03:42:35

标签: c++

class A
{
   public:
   class B
   {
       private:
         int ii;

   };
   void print(){cout<<B::ii<<endl;}
};

我的编译器说我无法访问ii中的整数; 我搜索这个网站,并拿出朋友密钥 我将其改为

class A
{
   public:
   class B
   {
       private:
         int ii;

   };
   friend void print(){cout<<B::ii<<endl;}
};

但它也不起作用。你能帮助我吗 ? 我被困了。真的很伤心,因为没有出路!

3 个答案:

答案 0 :(得分:4)

A包含B。但这并不意味着允许A访问B的私有。只有当BA成为朋友时才能这样做。

class A
{
   public:
   class B
   {
       private:
         int ii;
         friend class A;
   };
   void print(){cout<<B::ii<<endl;}
};

此外,iiB的非静态成员。您无法使用B::语法访问它;您需要一个B类型的实例。

答案 1 :(得分:1)

A类对B类成员没有特殊的访问权限,必须尊重ii的私有财产。您可以通过为B类创建set / get函数或通过使A成为B的朋友来访问ii。您还需要一个B类型的实际对象。

class A
{
   public:
   class B
   {
       private:
         int ii;
         friend class A;
   };

   B m_B;
   void print(){cout<<m_B.ii<<endl;}
};

答案 2 :(得分:0)

标准文本对此非常清楚:

C ++标准版(2003)以11.8美元/ 1 [class.access.nest]的形式说,

  

嵌套类的成员对a的成员没有特殊访问权限   封闭类,也不包括授予的类或函数   对一个封闭的阶级的友谊;通常的准入规则(第11条)   应遵守。 封闭类的成员没有特殊之处   访问嵌套类的成员;通常的访问规则(条款   11)应遵守。

现在,关于您问题中的第二个案例,print()函数是A的朋友,这意味着,它只能访问A的私有成员,而不能访问B的私有成员{1}},因为print()函数不是B的朋友。制作print()的{​​{1}}朋友不会自动将其A friend

顺便说一下,标准报价有一个缺陷。它说嵌套类无法访问封闭类的私有成员。但是在C ++ 0x中,它已得到纠正:在C ++ 0x中,嵌套类可以访问封闭类的私有成员(尽管封闭类仍然无法访问嵌套类的私有成员)。

请参阅此缺陷报告:


有点相关的主题: