嵌套类C ++中的友谊

时间:2016-10-12 14:26:26

标签: 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);
}

我收到以下错误:

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作为innerClass的友元类。

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

3 个答案:

答案 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()则不会。

Demo

  

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

右。来自标准 [class.access.nest]

  

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

  

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

右。来自标准 [class.access.nest]

  

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

答案 2 :(得分:0)

我认为你与nested classfriend 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