访问周围 class 的私有成员

Accessing private members of surrounding class

我有两个 类 这样的:

#include <iostream>

class A {
    public:
        class B {
            public:
                void    printX(void) const { std::cout << A::x << std::endl; }
        };
    private:
        int x;
};

显然这段代码不起作用,因为B无法访问x,但是有没有办法让它起作用?

我试过在 类 中使用 friend class 关键字,如下所示:

class A {
    public:
        class B {
            public:
            friend class A;
                void    printX(void) const { std::cout << A::x << std::endl; }
        };
        friend class B;
    private:
        int x;
};

但是也没用,不知道有没有可能。

错误消息应该告诉您,A::x 不是静态成员,因此您需要一个 对象实例 才能访问它。如果将对 A 实例的引用添加到 B::A,则可以使用它来访问 A::x.

例如下面的作品:

class A {
    public:
        class B {
            public:
                B(A const& a) : a(a) {}
                void printX(void) const { std::cout << a.x << std::endl; }

            private:
                A const& a;
        };
    private:
        int x;
};

请注意,使用引用成员有几个含义。值得注意的是,您现在不能再重新分配 A::B 类型的实例,其实例也不可移动。因此,在 A::B 中保存 指针 而不是对 A 的引用通常更方便。无论哪种方式,您都需要确保 A::B 的实例不会超过它们引用的 A 实例,否则您最终会得到一个悬空引用。

根据 C++ 17 标准(14.7 嵌套 classes)

1 A nested class is a member and as such has the same access rights as any other member. The members of an enclosing class have no special access to members of a nested class; the usual access rules (Clause 14) shall be obeyed.

所提供代码的问题是 x 不是 class A 的静态数据成员。您需要提供 class A 的对象,其数据成员 x 将在嵌套 class.

的对象中访问

例如

    class A {
    public:
        class B {
        public:
            void    printX( const A &a ) const { std::cout << a.x << std::endl; }
        };
    private:
        int x;
    };

    A::B().printX( A() );