内部私人成员访问和封闭的友谊

时间:2018-06-13 12:52:18

标签: c++ c++14 inner-classes friend

我试图找出如何使内部类型的private/protected成员可以访问其封闭类。

我的搜索引发了许多关于如何从内部类(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

我能找到的唯一问题就是C++ Outer class access Inner class's private - why forbidden,但建议的解决方案并不适用于我:

$ 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的访问权限?我错过了任何愚蠢的细节吗?

提前致谢。

3 个答案:

答案 0 :(得分:4)

您的代码正确授予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)访问该字段,请将其公开。

答案 1 :(得分:1)

你不能。

您似乎认为,因为_blabla的对象而bla是外部类,您可以在{{1}之外访问inner的私有字段}}。事实并非如此。

访问修饰符适用于范围,而不适用于您正在操作的对象。您可以访问bla的类主体中的inner的私有字段(在其方法等中)。不在它之外。

答案 2 :(得分:1)

使主要作为bla :: inner的朋友应该工作。

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

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