有一種方法可以解決它,但這也意味着你的班級組織已經壞了。
解決它的方法被稱爲「包括警衛,雖然很多編譯器還支持#pragma once
指令。我想這是行不通的,因爲#pragma once
可能不考慮包含頭文件,直到整個事情被解析。由於遞歸包含發生在頭文件的中間,所以還沒有完成解析。
一個包括後衛是這樣的:
在ClassA.h:
#pragma once // Just because. It really should help.
#ifndef INCLUDED_CLASSA_H
#define INCLUDED_CLASSA_H
#include "ClassB.h"
//... rest of header file
#endif
在ClassB.h:
#pragma once // Just because. It really should help.
#ifndef INCLUDED_CLASSB_H
#define INCLUDED_CLASSB_H
#include "ClassA.h"
//... rest of header file
#endif
組織問題被稱爲循環依賴,以及循環依賴通常是一個壞主意。有很多不同的方法可以打破它們,但是要使用哪種方法取決於依賴關係的確切性質和原始原因。
根據不同的問題,你可以使用各種技術之一:
從公共基類
談到這兩個類中的一個成一個基類爲其他
- 繼承 - 這是前一個的變體。
- 正向聲明 - 這是不希望這樣,因爲它並沒有真正打破循環依賴,它只是安排,所以你並不需要也有一個問題圓形包括依賴性。
- 車削兩個類的某些部分成一類,它們都可以使用- 這是共同的基類的另一種變型,使用的組合物,而不是繼承的。
還有其他技術。事實上,有一本書有各種各樣的技術可用於各種情況,因爲消除循環依賴是本書的一大主題。那本書是"Large-Scale C++ Software Design" by John Lakos。
它應該有一個連字符分開的稱號,我會補充說,現在,遺憾的混亂。 – 2013-02-15 01:33:21
通常情況下,通常會包含導致問題的實際代碼的代碼段。它可以是一個測試用例,只要它實際上存在你所問的問題,並且你已經測試了它,以確保它只是在這裏發佈。之所以這樣很難給出一個很好的具體答案。 – Omnifarious 2013-02-15 01:41:20