«имя класса» должно быть ранее определенным классом или структурой - PullRequest
0 голосов
/ 11 января 2012

Пожалуйста, посмотрите на этот простой класс:

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 ]

7 голосов
/ 11 января 2012

Для деривации прямого объявления недостаточно, необходимо включить полное определение класса.

Прямые объявления можно использовать только в том случае, если вы определите указатель или ссылку на класс в качестве члена или параметра метода,Как только вы действительно начнете использовать вещи (разыменовывая, получая доступ к члену по ссылке или производя, например), вам нужно включить определение всего класса.

2 голосов
/ 11 января 2012

Форвардные объявления полезны, только если вы объявляете указатель на класс. В этом случае полное определение класса не требуется.

Из класса получается отношение is-a. DenseTernaryPolynomial не может быть чем-то, о чем не знает, кроме того, что существует.

Значение sizeof для DenseTernaryPolynomial должно быть известно к концу определения класса, а также всех членов (унаследованных или нет), но предварительное объявление не предоставляет эту информацию.

Для наследования вы должны включить заголовок, в котором определен базовый класс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...