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

Friendship between two private, nested classes

提问人:mana 提问时间:8/13/2020 最后编辑:mana 更新时间:8/13/2020 访问量:75

问:

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

计划是让 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;
    }
    //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) {}

这段代码似乎有很多错误,但是在我试图让它工作的所有尝试中都存在许多不同类型的错误。对这些错误的解释会有所帮助,但我正在寻找一个工作的例子,说明如何正确地建立友谊和前瞻性声明。

C++ 内部类 正向声明 友类

评论

0赞 8/13/2020
这回答了你的问题吗?解决由于类之间的循环依赖关系而导致的生成错误
0赞 8/13/2020
顺便说一句:如果我上面的评论不清楚,问题不一定是声明本身,而是你有一个循环依赖关系。一旦你理顺了这一点,友谊问题就应该到位了。friend
0赞 mana 8/13/2020
@Chipster不,它没有。我提出的问题比那个例子更复杂,我无法将那篇文章中的想法扩展到我自己的问题。
1赞 mana 8/13/2020
@Chipster 不能转发声明私有的嵌套类。我什至不认为您可以转发声明嵌套类。
1赞 Igor Tandetnik 8/13/2020
您可以 forward-declare ,但只能在 的完整定义范围内 ;不能同时转发声明 和 。问题在于,要声明一个朋友,它至少需要看到 的正向声明,这需要 的完整定义 ,这需要完整定义 ,因为你想要一个数据成员。在这一点上,你已经把自己画到了一个角落里。A::A1AAA1A1B::B1B1BB1BB1

答: 暂无答案