2016-03-15 86 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++有沒有設備解除好友關係,所以允許外部類會偷你默認的私有訪問一個類設計工具和產量減少了默認封裝。

相關問題