2011-11-01 79 views
2

嵌套類在C++

class outer: public base 
{ 
public: 
class inner 
{ 
    foo(); 
} 
} 
  1. 我如何初始化這些嵌套類?
  2. 我可以從外部類調用foo()嗎?
  3. 你能告訴我什麼是我應該知道的嵌套類和訪問成員的拇指規則? 謝謝
+0

這功課嗎?它似乎是功課,總是使用作業標籤 – SpeedBirdNine

回答

6

我想你是來自java。

C++嵌套的struct/class就像一個java static嵌套類型。它與包含類型沒有實例關係。

事實上,您應該能夠將內部類移動到包含的命名空間,而不需要將前一個內部類標記爲外部類的朋友。

見示範http://ideone.com/ddjGX

  1. 我如何初始化這些嵌套類?

你不知道。您只能初始化成員(類實例

  1. 我可以打電話從外類Foo()?

除非你是朋友或方法(FOO())是公共

  1. 能否請你告訴我什麼是經驗法則,而嵌套類和訪問我應該知道成員?

我會選擇一個嵌套類型只有

  1. 類型是一個實現細節或依賴於外部類
  2. 的共享靜態成員的便利性(枚舉類型定義,模板參數,靜態方法和字段):內部類隱式地是外部類的朋友

我在下面說明了這些'經驗法則'。請注意嵌套類型如何透明地訪問專用外部類的成員。


struct base {}; 

class outer: public base 
{ 
    private: 
    enum { some=42, special=67, implementation=999, details=-13 }; 

    public: 
    struct inner 
    { 
     protected: 
     void foo() { int can_usethis = special + implementation + details; } 
    }; 

    outer() : _inner() { } 

    void call_inner(inner& i) const 
    { 
     //i.foo(); // fails (protected) 
    } 

    void call_inner() const 
    { 
     //_inner.foo(); // fails (protected) 
    } 

    private: 
    inner _inner; 
}; 


int main() 
{ 
    outer o; 
    outer::inner i; 

    // i.foo(); // fails: protected 
    o.call_inner(i); 
} 
1

您也可以使用範圍操作符::實例內的對象(外::內())。如果你想從外部類接受foo(),你可能想要定義類似inner的外部類似的朋友類。