2012-01-10 21 views
0

請看看這個簡單的類:「類名」必須是以前定義的類或結構

class TernaryPolynomial; 
class IntegerPolynomial; 

class DenseTernaryPolynomial:public IntegerPolynomial,public TernaryPolynomial 
{ 
public: 
DenseTernaryPolynomial(); 
static DenseTernaryPolynomial generateRandom(int,int,int); 
}; 

能否請您給我解釋一下,爲什麼編譯器抱怨TernaryPolynomial必須是以前定義的類或結構?我認爲它不應該在意,因爲我提出了該類的前瞻性聲明。 這裏的TernaryPolynomial類

class Polynomial; 
class IntegerPolynomial; 

class TernaryPolynomial:public Polynomial 
{ 
public: 
TernaryPolynomial(); 
virtual ~TernaryPolynomial(); 
virtual IntegerPolynomial toIntegerPolynomial() = 0; 
}; 
+0

相似:http://stackoverflow.com/questions/389957/forward-declaration-of-a-base-class – 2012-01-10 21:30:28

回答

7

對於推導預先聲明是不夠的,你需要包括完整的類定義。

前向聲明只能在定義指針或對類的引用作爲成員或方法參數時使用。只要你真的開始使用(通過解引用,通過引用訪問成員或者派生),你需要包含整個類的定義。

2

只有在聲明指向類的指針時,前向聲明纔有用。在這種情況下,完整的類定義是不需要的。

從一個類派生出一個is-a關係。 DenseTernaryPolynomial不能是它不知道的東西,除了它存在。

sizeofDenseTernaryPolynomial對於DenseTernaryPolynomial必須知道類定義的末尾,以及所有成員(繼承或不),但前向聲明不提供此信息。

對於繼承,您必須在定義基類的地方包含標頭。

相關問題