2016-08-18 49 views
3

我有以下情況:不包括類的頭時,只申報存在

class_a.hpp:

#include "class_b.hpp" // is this "include" mandatory? 
class class_a{ 
private: 
    class_b b; 
}; 

class_a.cpp:

#include "class_b.hpp" 
//code that uses member variables and functions from class_b 

class_b.hpp:

class class_b{}; 

是否可以在class_a.hpp中擺脫#include "class_b.hpp"?既然它只是聲明,爲什麼我不能只使用前向聲明而不包括它呢? (我試過了,但沒有編譯)

當然,我在class_a.cpp包括class_b.hpp

回答

9

由於class_b需要被存儲在內部class_a沒有任何間接(例如指針),的class_b需要大小的class_a聲明中是已知的。爲了知道尺寸,需要提供class_b的聲明:因此需要#include指令。

+0

我傻..這應該是顯而易見的。非常感謝 –

+0

@HumamHelfawi如果這是你的問題的答案,你應該接受它。 –

+0

@PeterK肯定:)它需要時間才允許接受它 –

3

爲什麼我不能只使用前向聲明而不包括它?

只有正向聲明類別class_b將是incomplete type。但要聲明爲非靜態類數據成員,需要它是完整的,它的大小和佈局必須知道。

以下上下文中的任何需要的類T是完整的:

... 
declaration of a non-static class data member of type `T`; 
... 

(一般情況下,當T大小和佈局必須是已知的)