Предварительное объявление класса приводит к неполной ошибке типа

0

Почему он генерирует ошибку в случае 1, но не в случае 2? Выполнение форварда компилятора declaraion относится к нему иначе? Я думаю, что это просто объявление для компилятора для поиска полного файла класса apple.

// CASE 1
class apple; // forward declaration

class fruit{
    apple b; // error: incomplete type but why? there is no recursion I guess
};

class apple{
   public: int a;
};

int main(){
   fruit f;
   return 0;
}

// CASE 2
class apple{
   public: int a;
};

class fruit{
   apple b; // no error works fine
};

int main(){
  fruit f;
  return 0;
}

Объясните мне, как это сделать. Любая помощь приветствуется.

Теги:

2 ответа

2
Лучший ответ

Форвардные декларации должны использовать указатели. Следующее должно компилироваться

class fruit{
    apple* b; // error: incomplete type but why? there is no recursion I guess
};

Причина этого в том, что при создании класса фруктов компилятор должен знать, сколько памяти он выделит для своих членов. В случае, если это указатель, это легко, либо 32-битные, либо 64-битные в зависимости от вашей архитектуры. Вот почему работает форвардная декларация.

Если вы попытаетесь выделить полный объект там, то компилятор должен знать, как большое яблоко будет зарезервировать для него память. Но поскольку он является только декларацией, он не знает этого размера и показывает ошибку

2

После форвардной декларации и до определения классный fruit действительно является неполным типом.

Вы можете использовать его только ограниченным образом, например, для определения указателей или ссылок на такие типы или для объявления (но не определения) функций, которые используют неполный тип в качестве параметра или типа возвращаемого значения. Однако в вашем коде вы используете тип fruit, а не указатель или ссылку на него, поэтому он является незаконным.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню