嵌套 类 C++ 中的友谊
Friendship in nested classes C++
我试图理解嵌套 classes 中的友谊概念,但我没有正确理解这个概念。我已经编写了一个示例程序来理解它,但该程序无法运行
#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
通过阅读网上的文章,我了解到以下几点,如果正确与否,请评论:
- innerClass默认可以访问outerClass的所有成员
- 为了让 outerClass 访问 innnerClass 的私有成员,我们需要将 outerClass 作为 friend class 到 innerClass。
请帮助指出代码中的错误以及我理解的要点是否正确。
outerClass
中的行 class innerClass;
是 前向声明 到您从未定义的 class
。
因此outerClass::innerClass
是一个不完整类型。
以
开头的单独innerClass
定义
class innerClass
{
是一个完全不同于class
的前向声明class。
您在定义的 innerClass
中的 friend class outerClass;
语句没有任何问题。
如果您想在 outerClass
之外定义 innerClass
,请按以下步骤操作:
class outerClass
{
class innerClass; // forward declaration
};
class outerClass::innerClass // definition
{
};
除了obj.b=5
,其他都还行。 classouterClass
允许访问innerClass::b
,函数main()
不允许
innerClass can access all the members of outerClass by default.
没错。从标准 [class.access.nest]:
A nested class is a member and as such has the same access rights as any other member.
For outerClass to access private members of innnerClass we need to make outerClass as friend class to innerClass.
没错。从标准 [class.access.nest]:
The members of an enclosing class have no special access to members of a nested class;
我认为您混淆了 nested class
和 friend class
您可以使用 friend class
而不是使用 nested class
和
你可以使用 nested class
而不是 friend class
这里有一些例子:
class A {};
class B {};
这里Aclass认识Bclass,但是B无法认识Aclass。所以你需要告诉 A class B class 存在。
这个做事,叫做Forward Declaration
所以:
class B; // forward declaration
class A {}; // A knows the B
class B {}; // B knows the A
我试图理解嵌套 classes 中的友谊概念,但我没有正确理解这个概念。我已经编写了一个示例程序来理解它,但该程序无法运行
#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
通过阅读网上的文章,我了解到以下几点,如果正确与否,请评论:
- innerClass默认可以访问outerClass的所有成员
- 为了让 outerClass 访问 innnerClass 的私有成员,我们需要将 outerClass 作为 friend class 到 innerClass。
请帮助指出代码中的错误以及我理解的要点是否正确。
outerClass
中的行 class innerClass;
是 前向声明 到您从未定义的 class
。
因此outerClass::innerClass
是一个不完整类型。
以
开头的单独innerClass
定义
class innerClass
{
是一个完全不同于class
的前向声明class。
您在定义的 innerClass
中的 friend class outerClass;
语句没有任何问题。
如果您想在 outerClass
之外定义 innerClass
,请按以下步骤操作:
class outerClass
{
class innerClass; // forward declaration
};
class outerClass::innerClass // definition
{
};
除了obj.b=5
,其他都还行。 classouterClass
允许访问innerClass::b
,函数main()
不允许
innerClass can access all the members of outerClass by default.
没错。从标准 [class.access.nest]:
A nested class is a member and as such has the same access rights as any other member.
For outerClass to access private members of innnerClass we need to make outerClass as friend class to innerClass.
没错。从标准 [class.access.nest]:
The members of an enclosing class have no special access to members of a nested class;
我认为您混淆了 nested class
和 friend class
您可以使用 friend class
而不是使用 nested class
和
你可以使用 nested class
而不是 friend class
这里有一些例子:
class A {};
class B {};
这里Aclass认识Bclass,但是B无法认识Aclass。所以你需要告诉 A class B class 存在。
这个做事,叫做Forward Declaration
所以:
class B; // forward declaration
class A {}; // A knows the B
class B {}; // B knows the A