2012-01-10 8 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 –

答えて

7

だ、あなたは完全なクラス定義を含める必要があります。

フォワード宣言は、クラスへのポインタまたは参照をメンバまたはメソッドのパラメータとして定義する場合にのみ使用できます。参照を使用してメンバーにアクセスする、または例えば派生することによってデリバリーすることによって、実際に物事を使い始めるとすぐに、クラス定義全体を含める必要があります。

2

フォワード宣言は、クラスへのポインタを宣言する場合にのみ有効です。この場合、完全なクラス定義は必要ありません。

クラスから派生すると、is-aの関係になります。 DenseTernaryPolynomialは、それが存在するということ以外の知識がないことはできません。

DenseTernaryPolynomialsizeofは、クラス定義の終わりまでに継承されているかどうかを知っていなければなりませんが、前方宣言はこの情報を提供しません。

継承の場合、基本クラスが定義されているヘッダーを含める必要があります。

関連する問題