2010-03-03 65 views
2

我有以下代碼:如何獲得嵌套類的實例在C++

class outer 
{ 
    struct inner 
    { 
     int var1; 
     int var2; 
     inner() { var1 = 1; var2 = 2; } 
    }; 

    inner inner_instance; 

public: 
    const inner *get_inner() { return &inner_instance; } 
}; 

int main(int argc, char *argv[]) 
{ 
    // 1 
    outer outer_instance; 
    cout << outer_instance.get_inner()->var1 << endl; 

    // 2 
    // this cannot be compiled because outer::inner is private 
    //const outer::inner *inner_ref = outer_instance.get_inner(); 
    //cout << inner_ref->var1; 

    // 3 
    const int *inner_var2 = (int *) outer_instance.get_inner(); 
    inner_var2++; 
    cout << *inner_var2 << endl; 

    return 0; 
} 

我明白了爲什麼2號不能編譯。我只是不知道編譯器的設計思路是什麼,它允許訪問私有嵌套類的公共字段,但不能訪問嵌套類本身,如No.1。實例數據仍在內存中。如果我知道這樣的私有嵌套類的結構,我仍然可以實現像No.3那樣的分配。

這是否意味着最好不要返回公共函數中的私有嵌套類的指針或引用?如果我真的需要將關於嵌套類的內容返回給外部世界,請將它公開嗎?

謝謝!

+0

不,如果你想隱藏任何東西使他們私密而不公開。 – 2010-03-03 11:59:20

回答

1

如果要在外部類之外使用它,請將結構內部定義放入公共中。

class outer 
{ 
public: 
    struct inner 
    { 
     int var1; 
     int var2; 
     inner() { var1 = 1; var2 = 2; } 
    }; 
private: 
    inner inner_instance; 
public: 
    const inner *get_inner() { return &inner_instance; } 
}; 
0

你是對的,如果公共API中使用的類型不是私有的,那麼最好。不過,它們可能只是前向聲明的(如果你只使用API​​上的指針或引用)。

+1

私有嵌套類只能由其宿主類使用,對吧? – 2010-03-03 11:00:08