我是C++編程新手,所以也許你會覺得我的問題太愚蠢了。對不起,但我想知道如何實現這種Java風格的結構:如何實現相互引用的類?
#include "B";
class A {
B objB;
}
---
#include "A";
class B {
A objA;
}
編譯器瘋了試圖瞭解此代碼。能否請你提供一個可能的解決方案?謝謝!
我是C++編程新手,所以也許你會覺得我的問題太愚蠢了。對不起,但我想知道如何實現這種Java風格的結構:如何實現相互引用的類?
#include "B";
class A {
B objB;
}
---
#include "A";
class B {
A objA;
}
編譯器瘋了試圖瞭解此代碼。能否請你提供一個可能的解決方案?謝謝!
此代碼是用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;
};
希望這有助於!
你需要前瞻性聲明
class B;
你定義的A類前,然後像以前一樣繼續。這將適用於引用,但不適用於這樣的對象,因爲你不能真正擁有一個對象隱式地包含它自己。
看到這個的另一種方法是考慮單個源文件,包括A.H或B.H「first」。 [「第一」被引用給出可能的混淆,以及。]
class A {
B objB;
}
class B {
A objA;
}
這是如何有道理?在我們知道B之前,我們不可能定義A,並且在我們知道A之前我們不能定義B.因此,通過間接方法解決其他人的問題。
非常感謝您的解釋。這對理解有幫助。 – Kid24 2011-02-04 06:01:09