内部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;
}
我唯一能找到治疗我需要的问题是 ,但建议的解决方案对我不起作用:
$ 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.
你不能。
你似乎认为因为 _bla
是 bla
的对象而 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;
};
我想弄清楚如何使内部类型的 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;
}
我唯一能找到治疗我需要的问题是
$ 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.
你不能。
你似乎认为因为 _bla
是 bla
的对象而 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;
};