0

我有一個稱爲A類,它有它的.cpp.hpp文件。它取決於類別BC。現在,我想知道,我應該在A.cppA.hpp#include B.hpp#include C.hpp?我認爲這將是對我有益的#includeA.hpp文件,因爲我創建的B*的一個載體,我不知道,編譯器會知道的B正確的大小,如果我只能向前聲明它(所以我不能正確地指出增量)......通過「前向聲明」,我的意思是在的開始處寫入class B;class C;可以在.hpp文件中包含嗎?

回答

3

前面已經提到的,你經常可以變通不必#include東西使用前聲明,並且確實是最好的做法是儘量減少包括其他頭的量。

但是:回答您的問題標題:是的,你可以,和普通的機制,以避免「夾雜」是以下

A.hpp:

#ifndef A_HPP_INCLUDED 
#define A_HPP_INCLUDED 

... // code 

#endif 

現在如果說B.hpp包括A.hpp,隨後,C.hpp樣子:

#ifndef C_HPP_INCLUDED 
#define C_HPP_INCLUDED 

#include "A.hpp" 
#include "B.hpp" 

... 
#endif 

這樣你就不會得到一個錯誤,指出如'A類'已經被定義。

1

如果它是B*一個向量,你並不需要在另一頭B.hpp。前向聲明沒問題。指針具有相同的大小,不管它們指向什麼。

它最好有包括只在必要時,這肯定看起來像它不是。

+0

是,指針自己做所有的大小相同,但是當你增加一個指針,它的地址實際上是在內存由它指向的類型的大小切換。所以我想知道這個功能是否會因爲前向聲明而受到影響...... – corazza

+0

編譯器會告訴你它是否只有前向聲明有問題;) – codeling

+1

@Bane如果你分開實現,那很好。你是否在標題中移動指針?如果沒有,沒關係。 –

1

我不知道如果我理解你的類層次結構,在我心裏是這樣的:

B.hpp

class B 
{ 
    B(); 
}; 

B.cpp

B::B() {}; 

C.hpp

class C 
{ 
    C(); 
}; 

A.cpp

A::A() {}; 

A.hpp

class A 
{ 
    A(); 
    B *b; 
    C *C; 
}; 

A.cpp

#include "B.hpp" 
#include "C.hpp" 

A::A() : 
    b(NULL), c(NULL) 
{ 
}; 

這是正確的嗎? (如果沒有,請考慮提供一些代碼;)如果您的class A有指向class Bclass C的前向聲明必須是唯一需要的。

我不知道,編譯器會知道B的正確尺寸,如果我只能向前聲明它

是的,只要你有在A.cpp文件B.hppC.hpp編譯器將能夠推斷出其大小(班級大小,指針大小始終相同)。爲什麼?僅僅因爲在cpp文件中它知道由於#include而產生的正確尺寸。我發現this answer,這將有助於理解我想說的。

將在hpp文件,而不是罰款?也許,如果您的A.hpp不會包含在其他文件中,則class Bclass C不會打擾並傳播到其他文件中。所以,如果情況不是必需的。但恕我直言最好的做法是轉發聲明並#includecpp文件時,它是可能的。

相關問題