我试图理解嵌套类中友谊的概念,但我没有正确理解这个概念。我已经编写了一个示例程序来理解它但该程序无法正常工作
#include<iostream>
using namespace std;
class outerClass
{
private:
int a;
public:
class innerClass;
bool print(innerClass);
};
class innerClass
{
friend class outerClass;
private:
int b;
public:
innerClass() =default;
};
bool outerClass::print(outerClass::innerClass obj)
{
cout<<"Value of b in inner class is:"<<obj.b;
}
int main()
{
outerClass in;
outerClass::innerClass obj;
obj.b=5;
in.print(obj);
}
我收到以下错误:
try.cpp: In member function ‘bool outerClass::print(outerClass::innerClass)’:
try.cpp:26:6: error: ‘obj’ has incomplete type
try.cpp:11:15: error: forward declaration of ‘class outerClass::innerClass’
try.cpp: In function ‘int main()’:
try.cpp:34:28: error: aggregate ‘outerClass::innerClass obj’ has incomplete type and cannot be defined
当我阅读互联网上的文章时,我了解了以下几点,如果它们是正确的,请对它们发表评论:
请指出代码中的错误,以及我理解的点是否正确。
答案 0 :(得分:4)
class innerClass;
中的outerClass
行是前向声明到您永远不会定义的class
。
因此outerClass::innerClass
是不完整类型。
以
开头的单独innerClass
定义
class innerClass
{
与前向声明的类完全完全不同class
。
定义的friend class outerClass;
中的innerClass
语句没有任何问题。
答案 1 :(得分:2)
如果您想在innerClass
之外定义outerClass
,请按以下步骤操作:
class outerClass
{
class innerClass; // forward declaration
};
class outerClass::innerClass // definition
{
};
除了obj.b=5
之外,其余的都没问题。允许班级outerClass
访问innerClass::b
,而main()
则不会。
innerClass默认可以访问outerClass的所有成员。
右。来自标准 [class.access.nest] :
嵌套类是成员,因此具有与任何其他成员相同的访问权限。
要使outerClass访问innnerClass的私有成员,我们需要将outerClass作为innerClass的友元类。
右。来自标准 [class.access.nest] :
封闭类的成员对嵌套类的成员没有特殊访问权限;
答案 2 :(得分:0)
我认为你与nested class
和friend class
混淆了
您可以使用friend class
而不是使用nested class
和
您可以使用nested class
而不是friend class
以下是一些例子:
class A {};
class B {};
这里A类知道B类,但B不能知道A类。所以你需要告诉A类B类是否存在
这件事,被称为前进声明
所以:
class B; // forward declaration
class A {}; // A knows the B
class B {}; // B knows the A