2011-06-16 51 views
2

我正在整合某人的代碼,它將所有內容都包含在一個cpp文件中。主要代碼是這樣的:嵌套類作爲C++中成員函數的參數

class Outer 
{ 
public: 
    struct Inner 
    { 
     struct In_inner 
     { 
     ... 
     } 
    } 
    int func(Inner& inn, Inner::In_inner& in_inn) 
    { 
     ... 
    } 
} 

爲了分離,我應該爲「Inner」參數添加「Outer ::」,如下所示?

在頭文件

class Outer 
{ 
public: 
    struct Inner 
    { 
     struct In_inner 
     { 
     ... 
     } 
    } 
    int func(Inner& inn, Inner::In_inner& in_inn); 
} 

和cpp文件

int Outer::func(Outer::Inner& inn, Outer::Inner::In_inner& in_inn) 
{ 
    ... 
} 

這聽起來有點不可思議,我認爲參數列表是從聲明有點不同。另外,我是否可以將所有內容都保存在同一個文件中,並將其作爲頭文件包含在內?

感謝您的任何意見!

+0

你有沒有做過測試自己嗎? – 2011-06-16 13:41:04

+0

nope,我需要一些專業知識;-) – pepero 2011-06-16 13:52:13

回答

4
int Outer::func(Outer::Inner& inn, Outer::Inner::In_inner& in_inn) 

是的。你已經正確地寫了這個。如果您在課堂外定義它,則必須添加Outer::


這聽起來有點不可思議,我認爲參數列表是從聲明

這是正常情況有點不同。該功能在課堂外定義。你不在班上。因此它看起來有點不同。

但是,如果你不希望它看起來不同,那麼你可以寫在聲明Outer::爲好,如下圖所示:

class Outer 
{ 
public: 
    //... 
    int func(Outer::Inner& inn, Outer::Inner::In_inner& in_inn); 
}; 

這是罰款,而且會工作,因爲Outer是注入名稱,它也可以在類中使用。

struct A 
{ 
    struct B { 
     struct C {}; 
    }; 

    B b1; //okay - as usual 
    A::B b2; //this is also okay - not so usual though 

    B::C c1; //okay - as usual 
    A::B::C c2; //this is also okay - not so usual though 

    A::A::A::A::A::A *pA; //this is very very unsual. But it is also okay! 
}; 

最後一行是好的,因爲名稱AA類的定義內注射。因此它變得遞歸可用。

看到它編譯罰款:

+1

感謝你Nawaz爲你的解釋性答案。 – pepero 2011-06-16 13:54:27

+0

@pepero:請參閱我答案中的編輯。 – Nawaz 2011-06-16 14:00:13

+1

好開心!感謝您展示這一點。 – pepero 2011-06-16 14:03:44

1

在類聲明/定義中,你在Outer ::的範圍內。在那之外(在你的.cpp中),你不是。 是的,您可以在頭中保留函數定義:它是一個隱式內聯。

2

參數列表沒有區別;類型是相同的。在頭文件中顯式限定std::成員並在源文件中使用using namespace std;並不罕見。這基本上是一樣的。

無論您如何限定類型,只要它們指的是相同類型即可。而且,由於源文件中不包含Outer的範圍,因此在此處需要顯式限定條件。

+0

感謝您的評論!這解除了我的懷疑。 – pepero 2011-06-16 13:49:41