2013-02-24 120 views
0

我有一個問題,我有幾個頭文件,我需要包括他們每個人在對方。顯然,這是不能做到的,因爲當我編譯時,會拋出錯誤「include nested too deeply」 - 因爲這基本上要求編譯器輸入一個無限循環。頭文件和多個類的用法(編輯:轉發聲明)

我可以使用void指針來修復它,但是這對我來說似乎是不好的編碼習慣。

這裏是什麼,我試圖做的,爲了幫助理解的例子:

文件-A:

#include "File-B" 
#include "File-C" 
class A 
{ 
    public: B* p_B; 
    public: C* p_C; 
}; 

文件-B:

#include "File-A" 
#include "File-C" 
class B 
{ 
    public: A* p_A; 
    public: C* p_C; 
}; 

文件-C:

#include "File-B" 
class C 
{ 
    public: B* p_B; 
}; 

這只是顯示在哪裏e ach類聲明是必要的。當然有更好的解決方案void*

編輯:我已經使用包括衛兵,這段代碼只是爲了幫助你看看我想要做什麼。

回答

1

如果您正在使用指針或引用的其他類,並在頭文件沒有代碼,你可以使用前置聲明:

class A; // Forward declaration 

class C; // Forward declaration 

class B 
{ 
    public: 
    A* p_A; 
    C* p_C; 
}; 

如果在頭文件中的代碼是指任何成員的其他類,你將不得不包含其他類的全部定義。

1

我會使用包括守衛,其中只包括一個特定的文件一次。

#ifndef FILE_A 
#define FILE_A 
class A 
{ 
    public: B* p_B; 
    public: C* p_C; 
}; 
#endif 

http://en.wikipedia.org/wiki/Include_guard

它僅包括頭文件,每個文件一次。 您也可以使用#pragma_once,雖然它不是標準的。

在不起作用的情況下,您可以使用前向聲明。

class B; 
class C; 
class A 
{ 
    public: B* p_B; 
    public: C* p_C; 
}; 
+0

你可能已經切換了。首先使用前向聲明,然後包含這些文件。當訪問或引用其他類中的任何內容時,類定義是必需的。 – 2013-02-24 19:52:20

3

您應該使用include guards

#ifndef _FILE_A_H_ 
#define _FILE_A_H_ 

// Contents of FileA.h... 

#endif 

可能的話,還可以使用打破你的數據結構的定義之間循環依賴。

FileA.h

class B; // No need to #include "FileB.h" 

class A 
{ 
public: 
    B* pB; 
}; 

FileB.h

class A; // No need to #include "FileA.h" 

class B 
{ 
public: 
    A* pA; 
}; 
+0

似乎downvoter對每個人都試圖回答這個問題感到不安... – 2013-02-24 18:15:12

+0

嗨,前瞻性聲明是我在找什麼,謝謝我會在第二秒接受這個答案... – user3728501 2013-02-24 18:16:51

+0

好,雖然結構聲明應該可以是類聲明。 – 2013-02-24 18:20:39

0

這就是爲什麼你必須#include <>警衛。

#ifndef _FILE_B 
#define _FILE_B 
#include "File-A" 
#include "File-C" 
class B 
{ 
    public: A* p_A; 
    public: C* p_C; 
}; 
#endif 
+0

downvoter謹慎解釋? – 2013-02-24 18:14:49

+0

他不希望這個問題很可能得到回答。他低估了他們的一切。 – 2013-02-24 18:15:34

+0

@AndyProwl允許對方補償。 – 2013-02-24 18:16:02