class X
{
int Xi;
class Y
{
int Yi;
void func()
{
X x;
x.Xi = 5;
}
};
void func()
{
Y y;
y.Yi = 5;
// ^^^^ 'X::Y::Yi': cannot access private member declared in class 'X::Y'
}
};
[我正在学习Memento模式,在我读过的书中说,实现模式的一种方法是通过在Memento
类内部编写Originator
类,以便只有Originator
可以有权访问Memento
类的私有成员。当我尝试应用此方法时,出现错误消息,告诉我该私人成员不可访问。我知道我可以使用关键字friend
,这将使我可以访问私有成员。我也知道我可以从内部类访问外部类的私有成员。但是为什么内部类不能访问内部类的私有成员?
例如,我可以在Java中执行此操作:
public class X {
int Xi;
public class Y
{
private int Yi;
public void func()
{
X x = new X();
x.Xi = 5;
}
}
public void func()
{
Y y = new Y();
y.Yi = 5;
}
}
为什么在C ++中不可行?
尽管有问题的标题,但您想在y.Yi = 5;
行上执行的操作是从outer的正文访问inner类的私有成员。 类。您无法执行此操作,因为Yi
成员是private-因此只能从其类内部进行访问。
另一方面,第x.Xi = 5;
行确实从inner类访问outer类的私有成员;您可以这样做,因为您的内部Y
类是外部X
类的一部分。
解决这个问题的一种方法是将X::func()
函数声明为class Y
的friend;但是,您将需要提供该函数的[prototype],然后进行声明,因此需要使函数outside的实际definition类主体(它必须在class Y
声明之后,因为它使用该类的对象):class X {
private: // Even without this line, members are private by default!
int Xi;
void func(); // Just a declaration (prototype) - wwwe still need the definition
class Y {
private:
int Yi;
void func() {
X x;
x.Xi = 5;
}
friend void X::func();
};
};
void X::func() { // This is the actual definition of the function.
Y y;
y.Yi = 5;
}