2016-03-15 78 views
9

你好,我想知道为什么C++标准允许我们在嵌套类访问外部类的私有字段,而禁止从外部类访问内部类的私有字段。我明白,这个例子: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,但现在第二个例子也是禁止的。 原因是什么,第一个例子被允许而另一个被拒绝?

回答

15

本质上,代码范围内有权访问在该范围内早些时候声明的事物(除非它们被映射)。代码外部作用域无法访问范围内的内容。例如。代码花括号后面的代码,无法访问该块内声明的变量。


对于第二个例子,只是做Algorithm一个friendAlgorithmResults的:

class AlgorithmResults 
{ 
    friend class Algorithm; 
+5

对不起,我倒转了友谊,不得不修复。这是在发布到SO之前需要咖啡的另一个证明! –

4

嵌套类可以访问外部类的私有域,因为它的外部类中的一员,只是相同其他成员。

从11.7/1的嵌套类[class.access.nest]

嵌套类是一个部件,因此具有相同的访问权限的任何其它构件。

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

成员的封闭类对嵌套类的成员没有特殊访问权;应遵守通常的访问规则(第11条) 。

+0

这只是重复事实,但OP希望事实是合理的(尽管我不认为这是一个特别好的问题)。 –

+0

@BarryTheHatchet我试图从内部类到外部类的不同视图来解释它,并且向内部类传出类。不清楚? – songyuanyao

+0

你很好地解释了规则。我只是不认为这是OP所要求的。 –

5

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

如果你需要一个外部类访问内部类的私有内部,你可以交好:

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

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

C++有没有设备解除好友关系,所以允许外部类会偷你默认的私有访问一个类设计工具和产量减少了默认封装。

相关问题