C++ 两个私有嵌套类之间的友谊

C++ 两个私有嵌套类之间的友谊,c++,inner-classes,forward-declaration,friend-class,C++,Inner Classes,Forward Declaration,Friend Class,我有4个班,A、A1、B和B1。类A包含私有嵌套类A1,类B包含私有嵌套类B1。我希望B::B1类的构造函数能够访问A::A1类型对象的私有数据成员。我的解决方案是使用关键字“friend”。然而,我很难让外部类之间的相互友谊发挥作用,而在线指南并不能解释两个私有嵌套类之间的友谊 计划是让B成为a的朋友,以便B1了解A1。然后让A成为B的朋友,这样A1就知道B1了。然后让B1成为A1的朋友,这样B1就可以访问A1的私有数据成员。下面是一些无法做到这一点的代码。你可以随意忽略它 //A.h

我有4个班,A、A1、B和B1。类A包含私有嵌套类A1,类B包含私有嵌套类B1。我希望B::B1类的构造函数能够访问A::A1类型对象的私有数据成员。我的解决方案是使用关键字“friend”。然而,我很难让外部类之间的相互友谊发挥作用,而在线指南并不能解释两个私有嵌套类之间的友谊

计划是让B成为a的朋友,以便B1了解A1。然后让A成为B的朋友,这样A1就知道B1了。然后让B1成为A1的朋友,这样B1就可以访问A1的私有数据成员。下面是一些无法做到这一点的代码。你可以随意忽略它

    //A.h
    #pragma once
    #include "B.h"
    
    class A {
        friend class B;
    private:
        class A1 {
            friend class B::B1;
        private:
            int num = 3;
        };
        A::A1 a1;
    }

这段代码似乎有很多错误,但在我所有让它工作的尝试中都有许多不同类型的错误。对这些错误的解释可能会有所帮助,但我正在寻找一个如何使友谊和转发声明正确的工作示例。

这是否回答了您的问题?顺便说一句:如果我上面的评论不清楚,问题不一定是
friend
声明本身,而是你有一个循环依赖关系。一旦你解决了这个问题,友谊的问题就应该解决了。@Chipster不,事实并非如此。我提出的问题比那个例子更复杂,我无法将文章中的想法扩展到我自己的问题。@Chipster你不能向前声明私有嵌套类。我甚至不认为您可以转发声明嵌套类。您可以转发声明
A::A1
,但只能在
A
的完整定义内;您不能同时向前声明
A
A1
。问题是,对于
A1
要声明
B::B1
朋友,它至少需要看到
B1
的转发声明,这需要
B
的完整定义,这需要
B1
的完整定义,因为您希望
B
拥有
B1
数据成员。在这一点上,你已经把自己画进了一个角落。这是否回答了你的问题?顺便说一句:如果我上面的评论不清楚,问题不一定是
friend
声明本身,而是你有一个循环依赖关系。一旦你解决了这个问题,友谊的问题就应该解决了。@Chipster不,事实并非如此。我提出的问题比那个例子更复杂,我无法将文章中的想法扩展到我自己的问题。@Chipster你不能向前声明私有嵌套类。我甚至不认为您可以转发声明嵌套类。您可以转发声明
A::A1
,但只能在
A
的完整定义内;您不能同时向前声明
A
A1
。问题是,对于
A1
要声明
B::B1
朋友,它至少需要看到
B1
的转发声明,这需要
B
的完整定义,这需要
B1
的完整定义,因为您希望
B
拥有
B1
数据成员。在这一点上,你已经把自己画进了一个角落。
    //B.h
    #pragma once

    class A;
    
    class B {
        friend class A;
        //stuff
    private:
        class B1;
    public:
        B1& b; // I would prefer this to not be a reference
        B(A a); // Error: incomplete type
    };
    // B.cpp
    #include "B.h"
    #include "A.h"
    
    class B::B1{
        B::B1(A::A1 a1) {
            int num = a.num;
        };
            int num;
    };
    B::B(A a) : b(a.a1) {}