2013-04-11 31 views
1

相關先前question,我現在下面的一個有B是不完整的類型。解決方案是通過例如智能指針,通過B的指針來改變B。但添加指針會增加複雜性和資源消耗,因爲您不需要指針!避免循環依賴?</p> <p>在接下來的風景:</p> <pre><code>class B; class A { // stuff, methods and so on B b; }; class B { // stuff, methods and so on A a; }; </code></pre> <p>下面我們就<code>A</code>和<code>B</code>之間的循環依賴,但由於該代碼是形成不良的

在前面的question我試圖通過模板的方式避免使用指針,所以我在定義了兩個類的時候延遲了類的時間點,但是我無法成功地做到這一點。

難以避免指針嗎?有沒有衆所周知的設計避免循環依賴?

+6

如果它編譯的話,這甚至沒有意義。你所說的是'A'的一個實例包含'B'的一個實例,而'B'的一個實例也包含'A'的一個實例。您需要無限量的內存和無限的時間來創建這樣的對象。也就是說,A的構造函數和B的構造函數都會無限遞歸。 – cdhowie 2013-04-11 17:05:43

+1

你爲什麼試圖避免指針? – metalhead 2013-04-11 17:06:38

+3

您也可以使用引用。 – dyp 2013-04-11 17:09:15

回答

8

不可能避免某種形式的引用,例如指針。

正如你試圖做到的那樣,定義中有一個無限遞歸。一個A包括一個B其中包括和A,等等。所以,這兩個類都需要無限存儲,這顯然是荒謬的。

如果你真的有一個模型,其中包含AB包含B然後A這些類似乎是不能獨立生活,而不相互的。在這種情況下,也許你只有一個班,而不是兩個班。

+0

我想在這種情況下,這是「可能的」,因爲只有一個沒有其他字段。所以它不會倍增。但是,是的,在任何其他情況下都需要無限的記憶。 – Mysticial 2013-04-11 17:06:55

+0

@DyP這個問題並沒有說明OP爲什麼要做到這一點。 – cdhowie 2013-04-11 17:07:17

+4

@DyP發佈OP的請求是不可能的,這是回答SO的有效方法。 – Mysticial 2013-04-11 17:08:55

7

編譯器必須計算出B所需的空間。

它是如何做到這一點的?它證明了所需的空間是A的大小。

但是A的大小是B的大小。回到原點,編譯器必須永遠循環才能找出結果。因此它不編譯。

唯一的解決辦法是打破這個循環,即使用指針(智能或其他)。

3

我不認爲這主要是編譯器的問題(但它不能這樣做),而是設計中的問題:數據成員表示所有權。如果A具有類型B的數據成員,則A的實例擁有B的實例。

如果同樣適用於B,那麼你要麼得到環形的所有權(a擁有bb擁有a)或無窮級數的a0擁有b0擁有a1擁有b1 .....

因此,您必須表達至少兩種類型中的一種,即實例不擁有其他類型的實例。您可以使用(智能)指針或引用在C++中執行此操作,或者將對象傳遞給需要的類的每個成員函數。

+0

+1,最佳答案..... – 2013-04-11 17:25:31

相關問題