2016-03-03 77 views
0

由於類定義是內部鏈接,我們必須在使用它之前定義一個類。我無法弄清楚使用類聲明的情況,如class A;。在那兒?什麼時候聲明C++中使用的類?

+1

的可能的複製(http://stackoverflow.com/questions/553682/when-can-i-use-a-前向聲明) – merlin2011

回答

2

它用於前向聲明;想象兩個類有一個指針或提及對方的實例:

class A; 
class B; 

class A { 
    class B*ptr; 
    int x; 
    /// etc 
}; 

class B : A { 
    std::string s; 
    std::vector<A> v; 
    //// etc 
}; 

這對於可讀性也很有用;您可能希望首先在某個標題中列出所有類。

而且你可以直接聲明一個類並簡單地使用它的指針而不用定義該類。

BTW,C99對於structunion具有類似的前向聲明;並且轉發聲明函數也很有用。

2

這是一個forward declaration,這是一個處理頭文件中循環依賴的方法。

例如,如果兩個類中的每一個都包含一個指向另一個的指針,那麼您需要轉發聲明在翻譯單元中進一步定義的類。

0

您在詢問是否需要提前申報。

想象一下以下假設的例子:

class Man 
{ 
    Woman mySpouse; 
}; 

class Woman 
{ 
    Man mySpouse; 
}; 

我們必須明確一個類之前,我們使用它。

是的。所以你可以看到上面的例子,這是不可能的雞蛋情況(又名循環依賴)。這就是爲什麼你需要向前聲明和指針,如下圖所示:

class Man; // Forward declaration 
class Woman; // Forward declaration 
class Man 
{ 
    Woman * pMySpouse; 
}; 

class Woman 
{ 
    Man * pMySpouse; 
}; 

由於提前聲明,這應該工作正常。

見這個問題的答案:我什麼時候可以使用預先聲明] When can I use a forward declaration?

+1

只有當指針涉及(也許是間接的),否則(如果'女人'有一個額外的字段),你的班級將有無限大小,這是有道理的 –

+0

@BasileStarynkevitch這正是我的觀點。無論如何,只是編輯我的答案,以便更好地理解。 – vcp

相關問題