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

时间:2016-03-15 10:29:59

标签: c++ private

您好我想知道为什么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所允许,但现在第二个例子也被禁止了。 是什么原因,第一个例子被允许而另一个被拒绝了?

3 个答案:

答案 0 :(得分:15)

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

对于第二个示例,只需将Algorithm friend AlgorithmResults作为class AlgorithmResults { friend class Algorithm;

document.location.pathname == "/"

答案 1 :(得分: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
  }
};
     

- 结束示例]

答案 2 :(得分:5)

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

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

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

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

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