“类名”必须是先前定义的类或结构

时间:2012-01-10 21:25:08

标签: c++ inheritance

请看这个简单的课程:

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;
 };

2 个答案:

答案 0 :(得分:7)

对于派生,前向声明是不够的,您需要包含完整的类定义。

只有在将指针或对类的引用定义为成员或方法参数时,才能使用前向声明。一旦你真正开始使用东西(通过解除引用,通过引用访问成员或派生例子),你需要包括整个类定义。

答案 1 :(得分:2)

前向声明仅在声明指向类的指针时才有用。在这种情况下,不需要完整的类定义。

从类中派生会产生is-a关系。除了存在之外,DenseTernaryPolynomial不能是它不知道的东西。

sizeof DenseTernaryPolynomial必须在类定义的末尾以及所有成员(已继承或未继承)知道,但前向声明不提供此信息。

对于继承,您必须包含定义基类的标头。