2010-08-17 65 views
3

這可能看起來很奇怪,但我的程序中有一個問題,我有一個類A需要一個類B的變量,而類B需要一個指向內部類A的指針,以便我可以確定哪些類別附加到什麼...B類中的A類變量和A類中的B類指針變量?

我得到的錯誤是因爲在A類中它表示B類尚未定義,而在B類中它表示A類尚未定義...

我的兩個包含單獨的類的頭文件包含了彼此,我試圖轉發聲明我的類,例如A類; B類;但我得到編譯器錯誤,如:

error C2079: 'CFrame::menu' uses undefined class 'CMenu' 

我需要一個指向類B的類A的指針,因爲我想稍後將它傳遞給另一個類。

+0

難以表達的事物通常更難以理解。是的,現在你知道什麼是前向聲明瞭,這並不難,但是到8分鐘前,這對你來說是「不可能的」。 – msw 2010-08-17 23:05:18

回答

6

需要聲明A定義B前:

class A; // declaration of A 

class B // definition of B 
{ 
    A* foo; 
    // ... 
}; 

class A // definition of A 
{ 
    B bar; 
    // ... 
}; 

這種聲明往往被稱爲向前聲明

+1

問題是,您只使用B的前向聲明,而不是A,因爲A包含B類型的實例變量而不是指針。 – 2010-08-17 22:59:25

+0

啊是的,我在這裏有一個大混亂,我實際上這樣做,但我已經意識到,我的「安全衛士」,例如。 #ifndef CMENU_INCLUDED #define CMENU_INCLUDED,搞亂了它,所以我在它們之前包含了一個標題,並且只做了一個前向聲明,現在它可以工作!謝謝 – Kaije 2010-08-17 23:02:11

+0

它依賴於3.9.2/3 - 「指向不完整類型的指針是允許的,儘管對它們可以完成的操作有限制(3.9)」。因此,具有指向B的指針是合理的,即使B在該點上不完整 – Chubsdad 2010-08-18 02:34:57

2

首先,考慮重新設計你的類。循環依賴是不好的做法,而且你可以用更優雅的類設計完全避免這種情況。

class B; 

class A 
{ 
    B *pPtr; 
}; 

class B 
{ 
    A typeA; 
}; 
0

您可以簡單的通過指定什麼,以避免前向聲明 -

這就是說,你可以使用向前引用(在這一點上,你需要使用指針或引用)解決該問題得到「B」是:

class A 
{ 
public: 
    class B* pB; 
}; 

class B 
{ 
public: 
    A a; 
}; 

如果您遇到問題,可能是因爲您的執行與聲明一起。如果將實現和頭部分開,那麼在這種情況下可能會出現更少的問題。

相關問題