2012-10-11 56 views
4

標題已經說了很多,C++嵌套類,接入父親變量

但基本上我想要做的是以下(例):

我有一個稱爲A類和其他類中一個叫B,就像這樣:

class A 
{ 
    int a; 

    class B 
    { 
     void test() 
     { 
     a = 20; 
     } 
    }; 
}; 

正如你可以看到我的目標是爲B類有機會獲得A級,因爲它是一個嵌套類。不是這樣做不行,因爲B無法訪問A,但它如何訪問?

謝謝

回答

7

儘管您在A中聲明瞭B類,但A類和B類仍然是完全獨立的。唯一的區別是現在提到B,必須做A :: B。

對於B來訪問A的東西,你應該使用組合或繼承。對於組成,得到B,一個參照的對象,像這樣:

class B { 
public: 
    B(const A& aObj) : aRef(aObj) { 
    cout << aRef.a << endl; 
    } 
private: 
    const A& aRef; 
}; 

繼承,像這樣:

+0

只是爲了澄清,B將不再嵌套在上面的示例中。否則,類型B的對象將包含類型A的對象,其將包含類型B的對象... – mythagel

+0

您的B類代碼(第一個塊)對我來說沒有任何意義...構造函數的括號。 –

+0

@MiguelP,對不起,我修正了它。 – Philip

-1

C++嵌套類並不像Java嵌套類,它們不屬於A的實例,但都是靜態的。所以在這一點上不存在

1

內部類與C++中的外部類無關,因爲它在Java中。對於要訪問A對象的成員的A::B實例,它需要在某處有A的實例,就好像B不是嵌套類。 A::B的實例沒有任何隱含的A實例;你可以有許多A::B的實例,根本不存在任何A實例。

傳遞的A一個實例test,然後用它來訪問a成員:

void test(A& a_instance) 
{ 
    a_instance.a = 20; 
} 
1

類是類型,類型沒有數據。實例具有數據,但A的實例不包含(在您的示例中)包含B的實例,而B的實例不具有任何A實例的任何知識。

0

選擇

  • B是一個孩子A而不是包含的A
  • B的構造函數需要引用o創建它的A實例(首選)

現在,如果變量a是私人的,這仍然不會有幫助。您將需要訪問者或朋友關係。