簡體   English   中英

嵌套類'訪問封閉類'私有數據成員

[英]Nested class' access to enclosing class' private data members

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

例:

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錯誤。 當涉及嵌套類訪問其封閉類的成員時,是否有一些我缺少的東西?

成員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公開為public。 但是,這種情況在C ++ 98中被歸類為缺陷 ,並且決定內部類應該具有對外部類成員(甚至是私有成員)的完全訪問權限。 因此,您是否必須在訪問權限方面做任何額外的事情取決於您的編譯器。

與您的代碼的問題是不可見性 ,正如指出的AndreyT ,但該實例Inner類是未綁定到的具體實例Enclosing類。 換句話說,在構造Inner ,編譯器無法知道從哪個對象獲取xy值。

您必須向Inner類的構造函數顯式提供Enclosing類的實例,如下所示:

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) 
    { }
  };
};

嵌套類無法訪問封裝類的privet數據成員。如果我們嘗試訪問封閉類的privet成員,則顯示錯誤,它只能訪問封閉類的公共數據成員.....

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM