所以我有一個A類,我想調用一些B類功能。所以我包含「b.h」。但是,在B類中,我想調用A類功能。如果我包含「a.h」,它會以無限循環結束,對吧?我能做些什麼呢?可以使用C++兩個類互相看到對方嗎?
19
A
回答
26
每個類(A和B)都應該有一個頭文件和一個實現文件。
每個頭文件(例如A.h
)不應包括其他的頭文件(例如B.h
),但可包括正向參考其它類(例如像class B;
一個語句),並且然後可以使用指針和/或引用其聲明中的其他類(例如,class A
可能包含B*
作爲數據成員和/或作爲方法參數)。
每個CPP文件(例如A.cpp
)可以包括多於一個頭文件(例如A.h
和B.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
}
8
您還可以使用forward declarations來解決這個問題。
-7
試着把#ifndef
,#define
和#endif
圍繞你的.h文件。
相關問題
- 1. 兩個類可以相互訪問嗎?
- 2. 兩個班可以相互交友嗎?
- 3. Can類可以相互引用嗎?
- 4. 兩個模型可以相互對應嗎?
- 5. 兩個CloudKit可以相互調用死鎖嗎?怎麼修?
- 6. 在SQL中,兩個表可以互相引用嗎?
- 7. 兩個表格可以互相引用嗎?
- 8. 兩個iPhone應用程序可以相互溝通嗎?
- 9. gcloud nodejs模塊可以互相看到嗎?
- 10. 兩個VBA類屬性可以相互寫入以模擬重載嗎?
- 11. 爲什麼兩個類可以在JAVA中互相引用?
- 12. 3D對象在libGDX中可以互相看到
- 13. 兩個.NET EXE可以互相干擾嗎?
- 14. 兩個簡單的NFC標籤可以相互通信嗎?
- 15. 在SnapKit中,兩個視圖可以相互分隔嗎?
- 16. 我應該使用兩個可以相互殺死的線程嗎?
- 17. TFS項目可以相互引用嗎?
- 18. 我可以在Java中編譯兩個相互依賴的類嗎?
- 19. 同一類中定義的兩個結構體可以互相訪問嗎?
- 20. Visual C++/CLI兩個類對象之間的相互訪問?
- 21. 如何創建兩個可以相互監視的對象?
- 22. 可以通過django查看功能互相覆蓋嗎?
- 23. 兩個不同的類可以繼承相同的基類嗎?
- 24. 兩個python類實例互相引用
- 25. 兩個不同的網站可以互相交互localstorage
- 26. 兩個不同的類型類可以有相同的方法名嗎?
- 27. Swift - 我可以實現類的相互泛型引用嗎?
- 28. 兩個相對的div互相重疊
- 29. 可能有相互遞歸類嗎?
- 30. 面板可以相互溝通嗎?
這篇文章沒有回答這個問題.. – 2012-12-24 17:28:05