嵌套类 C++ 中的友谊

May*_*ain 5 c++ friend

我试图理解嵌套类中的友谊概念,但我没有正确理解这个概念。我已经编写了一个示例程序来理解它,但该程序不起作用

#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);
}
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

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
Run Code Online (Sandbox Code Playgroud)

当我阅读互联网上的文章时,我了解到以下几点,如果它们正确与否,请评论它们:

  • 默认情况下,innerClass 可以访问outerClass 的所有成员。
  • 为了使outerClass 访问innerClass 的私有成员,我们需要将outerClass 作为innerClass 的朋友类。

请帮助指出代码中的错误,以及我理解的要点是否正确。

Bat*_*eba 5

class innerClass;outerClass是一个向前声明class,你永远无法定义。

因此outerClass::innerClass是一个不完整的类型

innerClass以开头的单独定义

class innerClass
{
Run Code Online (Sandbox Code Playgroud)

是一个完全不同class的向前声明的类。

friend class outerClass;在定义的innerClass.


ser*_*gej 5

如果您想innerClass在 之外定义outerClass,请按以下步骤操作:

class outerClass
{
    class innerClass; // forward declaration
};

class outerClass::innerClass // definition
{
};
Run Code Online (Sandbox Code Playgroud)

其余的都还好,除了obj.b=5。类outerClass可以访问innerClass::b,函数main()则不允许。


innerClass默认可以访问outerClass的所有成员。

正确的。来自标准[class.access.nest]

嵌套类是一个成员,因此具有与任何其他成员相同的访问权限。


为了让outerClass访问innnerClass的私有成员,我们需要将outerClass作为innerClass的友元类。

正确的。来自标准[class.access.nest]

封闭类的成员对嵌套类的成员没有特殊访问权限;