2013-01-17 57 views
0

我有3類:包括類在源文件而不是頭

ClassA.h

ClassA 
{ 
    public: 
     ClassA(); 
}; 

ClassB.h

#include "ClassA.h" 

classB 
{ 
    public: 
     ClassB(); 

    private: 
     ClassA m_classA; 
}; 

ClassC.h

#include "ClassB.h" 

ClassC 
{ 
    public: 
     ClassC(); 

    private: 
     ClassB m_classB; 
}; 

ClassC需要ClassB和ClassB需要ClassA。 ClassC不需要ClassA,所以我應該把#include「ClassA.h」放在源文件裏面的ClassB頭文件中,並創建一個全局對象或者有更好的方法嗎?

ClassB.cpp

#include "ClassB.h" 
#include "ClassA.h" 

ClassA g_classA; 
+4

@Rapptz轉發聲明不聲明完整的類型,他不使用指針。 – imreal

+0

@尼克我似乎誤解了這個問題。 – Rapptz

回答

3

ClassBClassA對象,因此其類的聲明需要的ClassA的完整的聲明。因此,您需要在ClassB.h*中包含ClassA.h標頭,無論ClassC發生什麼情況。

如果你想避免包含標題你可以做的是存儲一個(智能)指針classA並轉發聲明它。那麼你只需要在classB.cpp中包含classA.h。下面是一個簡單的例子:

A.h

class A {}; 

B.h

#include <unique_ptr> 

class A; // forward declaration of A 

class B { 
public: 
    B(); 
private: 
    std::unique_ptr<A> a_; // C++11 smart pointer expressing unique ownership 
}; 

B.cpp

#include "B.h" 
#include "A.h" // we need the full declaration here. 

B::B() : a_(new A()) {} 

*嚴格地說,ClassA.h可以包括在其他網絡只要它間接包含在ClassB.h中。但最好在需要的地方包括你需要的地方,而不是依靠間接包含。

+0

絕對正確的代碼,但是...你可以使用pimpl來打破依賴。 –

+0

在*'ClassB.h'之前包含'ClassA.h' *和*'ClassB.h'中包含*一樣好。這可能是一個很好的建議,但它不是唯一的方法。 –

+0

@MarkRansom不錯,我在這裏增加了一個腳註。 – juanchopanza