2009-09-15 146 views
18

頭我很好奇設立類似於下面的示例場景:交叉引用包含在C++程序

這裏是一個將被放置在一個名爲那麼header1.h文件代碼:

#ifndef HEADER1_H 
#define HEADER1_H 

#include "Header2.h" 

class Class1 
{ 
Class2 class2Instance; 
}; 

#endif 

這裏是將被放置在一個名爲Header2.h文件代碼:

#ifndef HEADER2_H 
#define HEADER2_H 

#include "Header1.h" 

class Class2 
{ 
Class1 class1Instance; 
}; 

#endif 

我收到錯誤消息當我這樣做(因爲包括I假設),但它的感覺就像我需要這樣做是爲了至將每個對象包括在單獨的類中。任何人都可以幫助我做到這一點,我做錯了什麼?

回答

28

問題是Class1的大小取決於Class2,反之亦然。因此,沒有辦法計算任何一個的大小。前向聲明其中一個類,並將其中一個屬性更改爲指針或引用:

#ifndef HEADER2_H 
#define HEADER2_H 

class Class1; 
class Class2 
{ 
Class1 *class1Instance; 
// or 
Class1 &class1Instance; 
}; 

#endif 
+0

這是一個很好的答案,但它只是解決了我的問題的一半。我仍然將這兩個類放在兩個單獨的標題中。在輸入包含語句時,我得到一個錯誤,沒有包含循環類。你知道如何避免這個問題,而不把它們放在同一個標​​題中。 – banDedo 2009-09-15 21:50:12

+0

您收到什麼錯誤?您發佈的代碼與包含指令沒有任何問題。 – 2009-09-15 22:11:15

+0

那麼也許你應該給我們修改一個反映你當前代碼的例子,並且告訴我們你到底發生了什麼錯誤。 – TheUndeadFish 2009-09-15 22:13:15

1

您擁有的是經典的循環引用。這裏是Stack Overflow的already been discussed。只需將該接受的答案應用於該線程,而將「struct」替換爲「class」,並且您是金手指。

編輯的清晰度

+0

我相信接受的答案確實如此。因此,在接受的答案中將單詞「結構」更改爲「類」一詞,並且模式相同。請收回你毫無根據的downvote,kthxbai – Randolpho 2009-09-15 20:52:41

+0

那裏。 '完成了。 – Randolpho 2009-09-16 13:57:05

2

你不能有Class2中包含1類的實例,並有1類包含的Class2的一個實例。你可以做的是讓每個類都包含一個引用或指向其他類類型的實例(帶有適當的前向引用)。即


class Class2; 
class Class1 
{ 
    Class2& class2Instance; 
}; 

class Class1; 

class Class2 
{ 
    Class1& class1Instance; 
}; 
3

兩個結構無限遞歸彼此 - 知道Class1的大小,你需要知道的Class2大小要求的Class1大小等解決方法是在至少一種情況下使用指針:

#ifndef HEADER1_H 
#define HEADER1_H 

class Class2; // no need to include Header2 

class Class1 
{ 
    Class2* class2Instance; 
} 

#endif 
7

文件:那麼header1.h

#ifndef HEADER1_H 
#define HEADER1_H 

class Class2; // no need to include Header2 

class Class1 
{ 
    Class2* class2Instance; 
} 

#endif 

文件:header1.cpp

#include "header2.h" // do include Header2 here, otherwise you will get errors 

改編自here