2011-09-27 68 views
0

我將從我的問題開始: 我的問題是當我嘗試訪問類中某個實例的public函數時出現分段錯誤。有關C++中的類和類實例的常見問題

假設我有一個類A有一堆類實例的它像這樣:

class A { 
     ... 

    public: 
     class B *B; 
     class C *C; 

}; 

讓我們考慮類A是我們的「全局」類;也就是說,類A被髮送給我初始化和擁有的每個類。因此,每個類功能都可以調用AA->function()的功能。此外,假設其他實例已經初始化,每個類可以調用屬於A的實例的函數,如下所示:A->B->function()。到目前爲止,一切都很好。我的問題是,當我嘗試訪問屬於A的其中一個實例的函數時,突然發生段錯誤。我認爲原因是(爲什麼我問這個問題,因爲我不確定),是在實例B已經初始化之前,類實例A被髮送到類C。然後在類C中,我簡單地創建一個指針副本(意思是我的類C有一個名爲class A *A的私有實例A)。因此,當我第一次創建類C的實例時,我將它發送給類A及其所有公共成員,然後C的構造函數將A作爲本地副本。

Phew。沒有提交代碼很難做到這一點。所以這是一個問題。說的我班A功能之一包括:

C *c = new C(this); 

C構造具有這樣的:

C(A *a_val) { a = a_val; } 

,同時也包含了一個私有實例指針class A *a;

然後在A實例化另一個函數B類。我的C班級能夠使用B班嗎?如果沒有(這就是爲什麼我認爲我是違約的),我怎麼可能解決這個問題?

謝謝!

+0

對不起,我無法提供實際的代碼。這只是非常漫長,我不認爲在這裏粘貼數百行是必要的。 – Amit

+0

A,B和C之間是否有這種相互依存關係?我懷疑你的問題會隨着一些想法和重構而消失。而且,沒有代碼就很難設想你的問題。如何編寫一個小測試程序在這裏發佈? – MatthewD

+0

您可能對成員正在初始化的順序有問題,但沒有更詳細的示例就不清楚。 –

回答

0

一般而言,如果將指針取消引用單位變量,則代碼將會出現段錯誤。從你的描述來看,這聽起來像是正在發生的事情,雖然很難說因爲缺乏一個失敗的例子。

A中的另一個函數實例化B類。我的C班是 能夠使用B班嗎?

是的。這應該工作只要你正確地instantianted並通過指針正確B到C另外請注意,這將有助於獲得術語有點在上面的問題更正確的:

在一個另一個函數實例化的對象B類。我的C對象是 能夠使用該B對象嗎?

我相信以上是你的問題真正的意思。

+0

如果我在'B'實例化之前將'A'的指針傳遞給'C',但在實例化'B'後沒有使用'A-> B-> function()'*修正指針)?那還好嗎? – Amit

+0

@Amit是啊如果你在B類型的對象被實例化後告訴A這個新對象,那麼事情應該沒問題。儘管從描述中很難說出你想要做什麼。 – sashang

+0

所以如果'A'知道了這個新的'B'對象,並且在'B'被實例化之前'A'的指針被髮送到'C','C'仍然能夠使用'B'?我的理解是否正確? – Amit