2013-05-31 54 views
7

我在使用鏗鏘聲編譯器的C++中發出前向聲明的問題。這是我的代碼。它將CReference成員中的數據指向爲不完整類型。 請幫助向前在C++中聲明類,不完整類型

class Internal; 

class CReference { 
private: 
    Internal data; 
public: 

    CReference() {}  
    ~CReference(){} 
}; 

class Internal { 
public: 
    Internal() {} 
    ~Internal() {} 
}; 
+0

你根本不能在這裏使用前向聲明。 'CReference'需要'Internal'的完整聲明。 – juanchopanza

+0

如果你想轉發聲明,你應該使用一個指向'Internal'的指針。 – user1520427

+1

可能重複[何時使用前向聲明?](http://stackoverflow.com/questions/553682/when-to-use-forward-declaration) – juanchopanza

回答

3

向前聲明只允許您使用指針和引用它,額滿爲止聲明可以

15

向前聲明是有用的,當編譯器不需要類的完整定義。換句話說,如果您將Internal data;更改爲Internal* dataInternal& data,它將起作用。

使用Internal data;,編譯器需要知道Intrenal的全部定義,才能創建CReference類的結構。

+0

幾乎是一個完美的答案。剩下的就是提及他可以將「內部以上」的定義移到「CReference」上面,它將起作用。 –

+0

@RickYorgason - 當然,但我想OP知道,看起來很明顯,因爲'class Internal'不需要'瞭解'class CReference'。 –

1

要將類型用作類的成員,編譯器必須知道它有多大,以便可以正確計算類的大小。前向聲明不提供這些信息(C++不會向前看並試圖找到它,特別是因爲可能會在另一個翻譯單元中聲明正文),所以不能將其用作按值成員。

可以改爲使用指針或引用,因爲無論指向哪種類型的指針和引用都是相同的大小。然後,編譯器只需要知道該類型的大小,一旦開始操作它,就可以在沒有完整聲明的情況下離開。

0

如上所述。前向聲明在頭文件中僅使用一個類的普通指針時,可以避免使用頭文件中的頭文件。

您通常希望儘可能少地保持包含在頭文件中。 這可以通過前向聲明一個類來實現,但只有當它不是嵌套類時,並且只有當指針用於頭時,指針大小纔是所需的信息,它是由forward decl提供的。