为什么在嵌套类时不能从内部类访问外部类的私有成员?

问题描述 投票:0回答:1
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 ++中不可行?

c++ class private inner-classes access-specifier
1个回答
0
投票

尽管有问题的标题,但您想在y.Yi = 5;行上执行的操作是从outer的正文访问inner类的私有成员。 类。您无法执行此操作,因为Yi成员是private-因此只能从其类内部进行访问。

另一方面,第x.Xi = 5;行确实从inner类访问outer类的私有成员;您可以这样做,因为您的内部Y类是外部X类的一部分。

解决这个问题的一种方法是将X::func()函数声明为class Yfriend;但是,您将需要提供该函数的[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; }

© www.soinside.com 2019 - 2024. All rights reserved.