内部class 私有成员访问和圈内友好度

Inner class private member access and enclosing's friendness

我想弄清楚如何使内部类型的 private/protected 成员可以访问其封闭的 class。

我的搜索让我想到了很多关于如何从内部 class (e.g.) 访问 封闭成员 的问题,但这不是我想要的需要。许多其他帖子遍历Java,这绝对不是我需要的。这是 C++。

考虑这个 MCVE:

#include <iostream>

struct bla
{
    bla( );
    ~bla( );

    class inner;

    inner *_inner;
};

class bla::inner
{
public:
    inner( )
    :   field( 13 )
    {}

private:
    friend struct bla;

    unsigned field;
};


bla::bla( )
:   _inner( new inner )
{}

bla::~bla( )
{
    delete _inner;
}

int main( )
{
    bla _bla;
    _bla._inner->field = 42;
    std::cout << "bla::_inner->field: " << _bla._inner->field << std::endl;
}

Live example

我唯一能找到治疗我需要的问题是 ,但建议的解决方案对我不起作用:

$ g++ -std=c++14 -Wall inner_class.cpp -o inner_class
inner_class.cpp: In function ‘int main()’:
inner_class.cpp:23:11: error: ‘unsigned int bla::inner::field’ is private
  unsigned field;
           ^
inner_class.cpp:39:15: error: within this context
  _bla._inner->field = 42;
               ^
inner_class.cpp:23:11: error: ‘unsigned int bla::inner::field’ is private
  unsigned field;
           ^
inner_class.cpp:40:54: error: within this context
  std::cout << "bla::_inner->field: " << _bla._inner->field << std::endl;

如何正确地授予 bla 访问 field 的权限?我错过了任何愚蠢的细节吗?

提前致谢。

您的代码正确授予 bla 访问 bla::inner 的私有成员所需的友谊。但是,您的问题是您没有访问 bla 中的私有成员(可以访问),而是在 main 中访问它,当然没有访问权限。

如果你想让bla能够访问bla::inner::field,你需要给bla一些函数来访问它。示例:

struct bla
{
    bla( );
    ~bla( );

    class inner;

    inner *_inner;

    void setInnerField(int val) { _inner->field = val; }
};

// The rest as before

int main( )
{
    bla _bla;
    _bla.setInnerField(42);
    std::cout << "bla::_inner->field: " << _bla._inner->field << std::endl;
}

另一方面,如果您想让所有外部代码(例如 main)访问该字段,只需将其设置为 public.

你不能。

你似乎认为因为 _blabla 的对象而 bla 是外部 class 所以你可以访问 [=13= 的私有字段] 在 bla 之外。事实并非如此。

访问修饰符作用于作用域,而不作用于你正在操作的对象。您可以在 bla 的 class 主体中访问 inner 的私有字段(在其方法等中)。不在外面。

将 main 作为 bla::inner 的好友应该可以。

    class bla::inner
{
public:
    inner( )
    :   field( 13 )
    {}

private:
    friend struct bla;
    friend int main(); // Make main friend of bla
    unsigned field;
};