2009-12-03 49 views
19

所以我有一個A類,我想調用一些B類功能。所以我包含「b.h」。但是,在B類中,我想調用A類功能。如果我包含「a.h」,它會以無限循環結束,對吧?我能做些什麼呢?可以使用C++兩個類互相看到對方嗎?

回答

26

每個類(A和B)都應該有一個頭文件和一個實現文件。

每個頭文件(例如A.h)不應包括其他的頭文件(例如B.h),但可包括正向參考其它類(例如像class B;一個語句),並且然後可以使用指針和/或引用其聲明中的其他類(例如,class A可能包含B*作爲數據成員和/或作爲方法參數)。

每個CPP文件(例如A.cpp)可以包括多於一個頭文件(例如A.hB.h)。建議每個CPP文件應首先包含其自己的頭文件(例如,A.cpp應包括A.h,然後B.h,而B.cpp應包括B.h,然後A.h)。

每個頭文件應該只包含聲明,而不包含類的定義:例如,它將列出類的方法的簽名,但不包括方法體/實現(方法體/實現將處於.cpp文件,不在頭文件中)。由於頭文件不包含實現細節,因此它們不依賴於(不需要看到)其他類的細節;最多他們需要知道,例如,B是類的名稱:它可以從前向聲明中獲得,而不是在另一個頭文件中包含頭文件。

35

將只在頭部成員函數聲明(.H)文件,並把成員函數的定義中實現(的.cpp)文件。然後你的頭文件不需要包含對方,你可以在兩個實現文件中包含兩個頭文件。

對於情況下,當你需要引用成員的簽名其他類爲好,你可以使用預先聲明:

class A; 

這允許您使用指針和引用類型(A*A&),雖不A本身。它也不會讓你打電話給成員。

例子:

// a.h 
struct B; // forward declaration 

struct A { 
    void foo(B* b); // pointers and references to forward-declared classes are ok 
}; 


// b.h 
struct A; // forward declaration 

struct B { 
    void bar(A& a); // pointers and references to forward-declared classes are ok 
}; 


// a.cpp 
#include "a.h" 
#include "b.h" 

void A::foo(B* b) { 
    b->bar(*this); // full declaration of B visible, ok to call members now 
} 


// b.cpp 
#include "a.h" 
#include "b.h" 

void B::bar(A& a) { 
    a.foo(this); // full declaration of A visible, ok to call members now 
} 
-7

試着把#ifndef,#define#endif圍繞你的.h文件。

+1

這篇文章沒有回答這個問題.. – 2012-12-24 17:28:05

相關問題