C ++外部类访问内部类的私有 - 为什么禁止

问题描述 投票:10回答:3

您好我想知道为什么C ++标准允许我们在嵌套类中访问外部类的私有字段,而它禁止从外部类访问内部类的私有字段。我明白了,这个例子:

class OuterClass{
public:
    class InnerClass{
    public:
        void printOuterClass(OuterClass& outer) {cout << outer.m_dataToDisplay;};
    };
private:
    int m_dataToDisplay;
};

很好,因为内心,有时可能会很复杂。但我认为以下情况也很好:

class Algorithm{
public:
    class AlgorithmResults{
    public:
        void readAlgorithmResult();
    private:
        void writeAlgorithmResult();
    };

    void calculate(AlgorithmResults& results, Arguments...){
       //calculate stuff
       results.writeAlgorithmResult(results);
    }
};

对我来说,这种结构非常有意义,尽管在C ++中是不允许的。我也注意到,有一段时间两者都被Java所允许,但现在第二个例子也被禁止了。是什么原因,第一个例子被允许而另一个被拒绝?

c++ private
3个回答
15
投票

本质上,在范围内声明的范围内的名称是有效的并且可以直接使用(除非它们被遮蔽)。范围外的代码不能直接使用范围内声明的名称。例如。花括号块后面的代码,不能直接使用在该块内声明的变量(间接使用的一个例子是当外部代码有权访问花括号块内的静态变量的指针时)。


对于第二个例子,只需使Algorithm成为friendAlgorithmResults

class AlgorithmResults
{
    friend class Algorithm;

5
投票

反问题:你为什么要允许它?

如果你需要一个外部类可以访问内部类的私人内部,你可以成为朋友:

    class Foo {
    public:
            class Frob {
                    friend class Foo;
                    int privateDataMember;
            };

            Foo () {
                    Frob frob;
                    frob.privateDataMember = 3735928559;
            }
    };

C ++没有设备可以取消联系,因此允许对外部类的默认私有访问会窃取您的类设计工具并减少默认封装。


5
投票

嵌套类可以访问外部类的私有字段,因为它是外部类的成员,与其他成员一样。

[class.access.nest]/1

嵌套类是成员,因此具有与任何其他成员相同的访问权限。

另一方面,外部类对嵌套类没有特殊的访问权限,它们只是正常的关系。

封闭类的成员对嵌套类的成员没有特殊访问权限;应遵守通常的访问规则([class.access])。 [实施例:

class E {
  int x;
  class B { };

  class I {
    B b;                        // OK: E​::​I can access E​::​B
    int y;
    void f(E* p, int i) {
      p->x = i;                 // OK: E​::​I can access E​::​x
    }
  };

  int g(I* p) {
    return p->y;                // error: I​::​y is private
  }
};

- 结束例子]

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