我试图找出如何使内部类型的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;
}
我能找到的唯一问题就是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
的访问权限?我错过了任何愚蠢的细节吗?
提前致谢。
答案 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)
你不能。
您似乎认为,因为_bla
是bla
的对象而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;
};