[英]C++ include header file
所以,我遇到了一個問題:
class A 需要了解 class B,class B 需要了解 C,而 class C 需要了解 A。它本質上是一個圓,所以我得到定義錯誤。 我試過前向聲明,但不管在上面,不知道底部還有什么。
我怎么會 go 這樣的情況?
謝謝
大衛
假設這很簡單,Adam Mihalcin 上面的評論是正確的,因為類似的問題回答了它。 但無論如何我都會把它編碼出來。
假設你有這個(方法定義無關緊要):
class A
{
B* ptrB;
}
class B
{
C* ptrC;
}
class C
{
A* ptrA;
}
然后你可以像 Adam 鏈接的那樣,像這樣轉發所有 3 個:
class A;
class B;
class C;
並將該塊放在所有 3 個上方。 但這里重要的是,這是當有指向其他類的指針時,而不是組合,它們是 class 的一部分。您可以使用前向聲明來允許在處理指針時正確編譯,但不能使用其他數據類型。 所以如果有這個:
class D
{
B myB;
}
其他一切都與上述相同,您需要將 B 的“真實”定義置於 D 的“真實”定義之上。但是 rest 可能是相同的。 前向聲明僅對指針“有效”。
你必須在某處用指針打破你的依賴循環。 如果從來沒有指針,那么數據結構就是“無限”的,因此不起作用。 那是因為在我的示例中,D始終包含 B。但是如果 A 始終包含 B,B 始終包含 C,而 C 始終包含 A 怎么辦? 好吧,最后一個 A 需要另一個 B,它需要另一個 C,這...我希望你明白了。 但是有了指針,你可以循環它。 使用組合(不是指針)它不能循環。
如果這些類是緊密耦合的,那么你可以使用
否則,你可以
但很可能你有一個設計級別的錯誤,如果是這樣,就修復它。
您可以做的是在 header 文件中向前聲明 class A 為 class C,然后您在.cpp 文件中包含 header 為 class A。
有關如何轉發聲明 class A 的參考,請查看此參考 - Forward declarations in C++
很可能,您只是遇到了設計級錯誤。
但是,如果您必須這樣做,例如,只需嘗試通過聲明一個空的 class A,B 來利用前向聲明,而無需在 C 的 header 文件中提供任何詳細實現。 然后在需要使用A和B的實現文件中包含A和B的header。
請記住,您只能在 class C 的聲明中使用指針。
在您的 header 文件中使用下一個構造:
#ifndef MYCLASS_HPP__20120410__0747
#define MYCLASS_HPP__20120410__0747
// Your definions of class, struct, etc...
#endif//
並且所有包含的文件(除了自己的 Myclass.hpp)都應該在類頭文件 Myclass.hpp 中。 他必須包含在 Myclass.cpp 文件中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.