簡體   English   中英

C++包含header文件

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM