2011-02-04 51 views
1

我是C++編程新手,所以也許你會覺得我的問題太愚蠢了。對不起,但我想知道如何實現這種Java風格的結構:如何實現相互引用的類?

#include "B"; 
class A { 
    B objB; 
} 
--- 
#include "A"; 
class B { 
    A objA; 
} 

編譯器瘋了試圖瞭解此代碼。能否請你提供一個可能的解決方案?謝謝!

回答

5

此代碼是用C++違法和編譯器是正確的拒絕。問題是,如果在類型B的對象內有類型A的具體對象,反之亦然,那麼對任何對象的大小都沒有有意義的定義。特別是,C++中的對象必須至少有一個字節的大小。因此,給定一個類型爲A的對象(稱爲a),必須有一個字節的存儲空間,用於a,a.objB.objA,a.objB.objA.objB.objA等。實際上,您需要無限的存儲空間,因爲總會有一個對象嵌套在這些對象!

爲了解決這個問題,你需要改變它,這樣你就可以分別將指針存儲到A和B類型的B和A類型的對象中。這打破了鏈條,因爲當指針指向A對象時,指針本身不是A對象,因此只使用4個字節。一旦你有了這個,你可以使用前向聲明來聲明這些指針。例如:

文件:A.H:

class B; 
class A { 
    B* objB; 
}; 

文件:B.h:

class A; 
class B { 
    A* objA; 
}; 

希望這有助於!

+0

非常感謝您的解釋。這對理解有幫助。 – Kid24 2011-02-04 06:01:09

1

你不能實例化一個對象B對象A,其本身就是一個對象B內內。遞歸地,你將永遠無法構造對象,因爲它具有無限遞歸。

你可以做什麼:

#include "B" 
class A { 
    B *objB; 
} 

#include "A" 
class B { 
    A objA 
} 
+0

這實際上不會工作,如果標題正確包圍包含警衛。 – GManNickG 2011-02-04 06:56:46

+0

@GMan:當然。也可能是每個包含文件中的前向類聲明。 – Benoit 2011-02-04 07:37:32

2

你需要前瞻性聲明

class B; 

你定義的A類前,然後像以前一樣繼續。這將適用於引用,但不適用於這樣的對象,因爲你不能真正擁有一個對象隱式地包含它自己。

0

看到這個的另一種方法是考慮單個源文件,包括A.H或B.H「first」。 [「第一」被引用給出可能的混淆,以及。]

class A { 
    B objB; 
} 
class B { 
    A objA; 
} 

這是如何有道理?在我們知道B之前,我們不可能定義A,並且在我們知道A之前我們不能定義B.因此,通過間接方法解決其他人的問題。