2009-10-22 132 views
7

我在實現一個嵌套類的時候遇到了問題,它的構造函數是用一些封閉類的私有數據成員初始化的。嵌套類訪問封閉類的私有數據成員

例子:

Header File: 
class Enclosing { 
    //...Public members 
    //...Private members 
    int x, int y 
    class Inner; // Declaration for nested class 
}; 

Impl. File: 
// Stuff... 
class Enclosing::Inner { 
    explicit Inner() : foo(x), bar(y) // foo and bar are data members of Inner 
    //... 
}; 

我得到一個invalid use of non-static data member錯誤。當涉及到嵌套類訪問其封閉類的成員時,是否有某些我錯過了?

回答

18

會員xyEnclosing非靜態數據成員,這意味着它們只存在於Enclosing類的具體對象內。沒有具體的物體,xy都不存在。同時,您正在嘗試參考xy而沒有任何對象。這是無法完成的,這正是編譯器試圖告訴你的。

如果你想從xy初始化成員Inner::fooInner::bar,你必須Enclosing類型的具體對象傳遞到Inner的構造函數。例如

class Enclosing::Inner {  
    explicit Inner(const Enclosing& e) : foo(e.x), bar(e.y) 
    {} 
    //... 
}; 

需要特別注意的是:在最初的C++ 98中,內部類沒有特殊的權限訪問外部類。使用C++ 98編譯器,您必須爲內部類提供必要的特權(友誼),或者將成員公開爲xy。但是,這種情況在C++ 98中被歸類爲defect,並且決定內部類應該可以完全訪問外部類成員(即使是私有類)。所以,你是否需要做任何額外的訪問權限取決於你的編譯器。

+1

謝謝。我一邊研究C++ 98中的缺陷,一邊對其進行了研究,但不確定該怎麼做。感謝您清除所有內容。 – trikker 2009-10-22 14:01:18

8

與您的代碼的問題是not visibility,由AndreyT指出,但該Inner類的實例並不綁定到Enclosing類的具體實例。換句話說,在構建Inner時,編譯器無法知道哪個對象需要從中獲取值xy

你必須明確地提供Enclosing類的實例給Inner類的構造函數像這樣:

class Enclosing 
{ 
private: 
    int x; 
    int y; 

    class Inner 
    { 
    private: 
    int foo; 
    int bar; 

    public: 
    explicit Inner(const Enclosing& e) 
     : foo(e.x), bar(e.y) 
    { } 
    }; 
}; 
0

嵌套類無法訪問包含class.compiler的privet數據成員如果我們試圖訪問privet成員的封閉類,它只能訪問封閉類的公共數據成員.........