簡體   English   中英

如何實現相互引用的類?

[英]How to implement classes with references to each other?

我是C ++編程的新手,所以也許您會發現我的問題太愚蠢了。 抱歉,但是我想知道如何實現這種Java風格的結構:

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

編譯器瘋狂地試圖理解此代碼。 您能給我建議一個可能的解決方案嗎? 謝謝!

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

為了解決這個問題,您需要更改它,以便將指向 B和A類型的對象的指針分別存儲在A和B中。 這打破了鏈條,因為當A*指針指向 A對象時,該指針本身不是A對象,因此僅使用四個字節。 一旦有了這個,就可以使用前向聲明來聲明這些指針。 例如:

檔案:Ah:

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

檔案:Bh:

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

希望這可以幫助!

您需要轉發聲明

class B;

在定義A類之前,請像以前一樣繼續。 這將適用於引用,但不適用於此類對象,因為您不能真正讓對象隱式包含自身。

您不能實例化對象B內的對象B ,而對象A本身在對象B 遞歸地,您將永遠無法構造對象,因為它具有無限遞歸。

你可以做什么:

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

#include "A"
class B {
    A objA
}

看到這種情況的另一種方法是考慮一個單獨的源文件,其中包括“ first”或AH或BH。 [引述“第一個”也可能引起混淆。]

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

這怎么可能呢? 我們不可能在知道B之前定義A,也不能在知道A之前定義B。因此,解決方案是通過其他人指出的間接實現的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM