2011-03-09 53 views
0

我有一個問題:假定我有一個頭/源文件中設置並設定爲標題如下」C++週期性頭依賴性

BaseCharacter.h和BaseCharacter.cpp和EventTypes.h

BaseCharacter.h使用EventTypes.h中定義的結構體和類型定義,但EventTypes.h必須知道BaseCharacter.h中定義的BaseCharacter類,這會創建一個循環依賴關係,我敢肯定這就是停止編譯我的程序的原因。我拿出EventTypes.h和所有依賴EventTypes.h中的東西的方法,我的程序編譯得很好,但是如果我添加了EventTypes.h,那麼每個引用BaseCharacter.h的文件都會抱怨它找不到BaseCha類別。

有沒有辦法解決這個依賴問題?或者這不是什麼原因導致我的問題?

我使用的是2010 MSVC作爲我的編譯器

+1

Cyclical Headers和Forward Declarations已經在SO上進行了多次討論。只要看右邊的「相關」部分,你會找到答案。 – Tim 2011-03-09 00:18:03

回答

4

向前聲明。

在EventTypes.h,除去包括:增加

class BaseCharacter;

請注意,您只能在EventTypes.h使用引用和指針BaseCharacter,你不能如與BaseCharacter myChar;成員變量具有結構。

1

你應該好好看看你的設計,並確保它有意義;通常週期性依賴關係表明次優設計(儘管它可能是您需求的最佳解決方案)。

在任何情況下,您都可以在每個頭文件中預先聲明類,從而避免包含循環。這被稱爲使用forward declarations

另一個好的選擇是將BaseCharacter.h和EventTypes.h所依賴的東西提取到第一個包含的第三個頭文件中;那麼你只能在BaseCharacter.h上有EventTypes.h的單向依賴。

第三種方法是將所有內容簡單地合併成一個頭文件;這可能會或可能不會基於您的設計,但如果相互依賴關係足夠強大,那麼統一模型肯定是有意義的?

0

爲了增加提到前向聲明的答案,還有另一種略有不同的方法,它被稱爲PIMPL,它代表指向IMPlementation的指針。它通常與前向聲明一起使用,但可以不使用。這不僅有助於解決循環依賴問題,而且還可以大幅縮短構建時間並減少代碼依賴性。

0

一旦我有類似的問題,用模板解決它。你不能將EventTypes和/或BaseCharacter定義爲模板嗎?