2012-05-31 151 views
-1
遞歸頭

比方說,我要編這樣的事情:C++抽象類

//Prova.h: 
//-------------------- 
#ifndef _PROVA_ 
#define _PROVA_ 

#include "Terza.h" 

class Prova{ 
public: 
Prova(); 

}; 
#endif 

//Terza.h: 
//-------------------- 
#ifndef _TERZA_ 
#define _TERZA_ 

#include "EreProva.h" 

class Terza{ 
public: 
    Terza(); 
}; 
#endif 

//EreProva.h: 
//-------------------- 
#ifndef _EREPROVA_ 
#define _EREPROVA_ 

#include "Prova.h" 

class EreProva : public Prova{ 
    public: 
    EreProva(); 
}; 
#endif 

至極不會編譯說:「」 Prova':基類未定義「。

什麼是避免繼承類之間頭部的遞歸

+0

這是什麼抽象?你應該接受Aiok Save的答案。 –

回答

0

有時你可以通過特林以下解決這類問題的最佳途徑:(1)儘量在頂部添加「的#pragma一次」指令(雖然這可能是編譯器特定的(前一段時間我在VC++中開發時使用它)(2)不用在類中包含頭文件,您可以嘗試添加「類Prova」,或者任何類,以表示稍後將定義但現在想「使用」的類。

儘管如Als所說,最好避免這種設計。

4

如果您需要循環依賴關係,那麼您的設計出現問題,您應該重新訪問您的設計並嘗試去除這種複雜且不需要的循環依賴關係。

一個克服循環依賴的是使用Forward Declarations,但要注意,一旦你向前聲明一個類型的類型變得不完全類型編譯器和大約有,你可以用它做什麼業務的限制。您不能在需要編譯器知道該類型的內存佈局的類型實例上執行任何操作。

良好閱讀:
When can I use a forward declaration?

+0

+1提到破碎的設計。 **這是重要的位**,而不是一些解決它的語法技巧。 –

+0

假設Terza是一張地圖。 Prova是想要在該地圖上移動的東西。 EreProva是該地圖的基本平方。移動Prova我需要知道地圖。要繪製地圖,我需要使用正方形。 –

+0

其實現在我已經看得更仔細了...... –

0

在此代碼:

//Prova.h: 
//-------------------- 
#ifndef _PROVA_ 
#define _PROVA_ 

#include "Terza.h" 

class Prova{ 
public: 
Prova(); 

}; 

既然你不以任何方式使用Tezra類,你不需要#include。把它拿出來。此外,你缺少和#endif。關閉此文件中的#ifndef,並在此文件中匹配#endif

此外:

//Terza.h: 
//-------------------- 
#ifndef _TERZA_ 
#define _TERZA_ 

#include "EreProva.h" 

class Terza{ 
public: 
    Terza(); 
}; 
#endif 

#endif 

你也不要在此文件中使用EreProva類的話 - 那麼取出#include聲明。文件末尾還有一個額外的#endif。這裏只有一個#ifndef,所以應該只有一個#endif。拿出最後一個。

+0

我知道我不使用包括,這只是一個例子 –

+0

請張貼實際的代碼,演示你真正的問題有。那麼我們可以給你更好的建議。 –

+0

感謝您的回覆。我的問題是如何編譯的東西..我需要使用所有標題包括在內。例如在Terza中實例化一個變量EreProva,在Prova中實例化一個變量Terza。我希望知道除了重新考慮類依賴關係之外,是否還有其他方法 –