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;}
};
但它也不起作用。你能帮助我吗 ? 我被困了。真的很伤心,因为没有出路!
答案 0 :(得分:4)
A
包含B
。但这并不意味着允许A
访问B
的私有。只有当B
让A
成为朋友时才能这样做。
class A
{
public:
class B
{
private:
int ii;
friend class A;
};
void print(){cout<<B::ii<<endl;}
};
此外,ii
是B
的非静态成员。您无法使用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中,嵌套类可以访问封闭类的私有成员(尽管封闭类仍然无法访问嵌套类的私有成员)。
请参阅此缺陷报告:
有点相关的主题: