2011-03-16 57 views
1

類內如果我有以下語法在C++類

class A 
    { 
    public: 
     int stuff; 
      void helper(B temp, int d); //what about here? I'm getting a 'B' has not been declared error here. 
    private: 
     class B 
     { 
     public: 
      int stuffer; 
     private: 
      int x; 
     }; 
    }: 

請告訴我正確的方式把2級在我的執行文件?它會是 1::2::someMethod?或者2::someMethod

+3

你嘗試過嗎? – Arkadiy 2011-03-16 15:36:02

+2

'1'和'2'不是有效的類名。 – 2011-03-16 15:36:14

+0

雅我嘗試過,但我有太多的其他錯誤,所以我不知道什麼追溯到什麼尚未,但我只是想知道這個「官方」的裁決。 – Snowman 2011-03-16 15:45:34

回答

1

首先,類名不能以整數開頭。因此,重命名它們:

class A 
{ 
    public: 
     int stuff; 
    private: 
     class B 
     { 
     public: 
      int stuffer; 
     private: 
      int x; 
     }; 
    }; 

其次,由於嵌套類B是在私人部分,所以你不能從A類的範圍之外訪問它。 B僅可用於A。並且在A範圍內聲明B類型對象的語法將爲B bObj;

現在你應該先試試自己,然後再問更多的問題!


至於你的編輯(增加的問題):它不是編譯因爲由編譯器看到B temp的時候,它目前還沒有看到的B的定義,這就是爲什麼它說B沒有聲明!

修復非常簡單。聲明B使用數據之前,這樣的事情:

class A 
{ 
private: 
     class B 
     { 
     public: 
      int stuffer; 
     private: 
      int x; 
     }; 
    public: 
     int stuff; 
     void helper(B temp, int d); 

}; //<--- this is also fixed. your code has 'colon', instead semi-colon! 

而且閱讀類的末尾處的註釋!

+0

除非有朋友:) – Arkadiy 2011-03-16 15:38:34

+0

Whats oustide是什麼意思?我可以在我的A.cpp文件中訪問它嗎? – Snowman 2011-03-16 15:40:04

+0

@bitmoe:嘗試,試驗並瞭解! – Nawaz 2011-03-16 15:42:43

1

如果你在類1的方法中,你可以使用2 :: somemethod。在其他地方,使用1 :: 2 :: somemethod。 「Inside」包括類1的方法實現中的方法參數聲明,但不包括類1的方法實現的返回值聲明。

3

假設1和2與其他任何嵌套範圍一樣,指的是REAL類名稱,1::2::methodName

+0

請參閱更多問題的編輯 – Snowman 2011-03-16 15:43:24

0

這取決於你在哪個範圍級別。在類1的成員函數內部,它將是class_2::someMethod。在文件範圍內,它將是class_1::class_2::someMethod。完全限定這樣的函數或變量名稱總是正確的,但有時候它的輸入比絕對必要的更多。一般來說,當編譯器無法自行找出您所指的內容時,您需要使用範圍解析運算符::

在實踐中,找出最好的方法是試試看看會發生什麼。如果編譯器給你一個錯誤,把它放在它前面,然後再試一次。

0

語法嵌套類:

Class class_name1 
{ 
    Private: 
     Data members 
    Public: 
     Member functions 
     { 
     ......... 
     } 
     Class class_name2 //class2 is embedded with class1 
     { 
      Private: 
       Data members 
      Public: 
       Member functions 
       { 
       ......... 
       } 
     }; // class2 
}; //class1 

嵌套類能夠在另一個類中定義一個類由於一個類聲明中,定義一個範圍。

嵌套類僅在封閉類的範圍內有效。

需要嵌套類實際上不存在。