Почему я получаю эту ошибку при инициализации стека?

0

Я знаю, что следующий код неверен, но я действительно хочу знать, ПОЧЕМУ это невозможно.

struct nod {
    int val;
    nod a;
};

Конечно, я должен был сделать это nod *a, но почему я получаю поле a имеет неполный тип при компиляции? Я, однако, могу сделать указатель на структуру, которая имитирует ссылается другой часть памяти после того, как я освободить пространство с помощью нового оператора. a

  • 4
    Я думаю, что лучший вопрос был бы: почему это должно быть возможно?
  • 0
    узел не нод - также имея структуру с членом типа структуры? @JohnDibling сказал "Возможно ли это"?
Показать ещё 6 комментариев
Теги:

4 ответа

2

Сообщение об ошибке компилятора совершенно ясно:

 field 'a' has incomplete type 

К тому времени, когда компилятор достигнет этой строки кода, nod еще не полностью определен. Чтобы иметь член типа nod в классе, компилятор должен знать в minumum только, насколько большой nod. Поскольку nod еще не полностью определен, компилятор не знает, как будет большой nod.

Причина использования nod * instead of a кивок works is because the compiler doesn't need to know what is in a кивок in order to know how big a pointer-to- нод.

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

1

Поскольку компилятор знает, сколько памяти нужно выделить для nod* (обычно 32-разрядной или 64-разрядной), даже если сам nod еще не полностью определен. Другими словами, компилятору необходимо оставить только 32-битные или 64-битные слоты в этом поле указателя.

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

1

Подумайте об этом: если nod содержит еще один nod, который, в свою очередь, содержит еще один nod который... (ad libitum), nod эффективно будет бесконечного размера!

0

Ваш вопрос недостаточно ясен относительно того, что вы готовы сделать.

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

Если вы выполняете только форвардную декларацию, например:

class nod;

Компилятор знает, что кивок - это класс, определенный в другом месте. Затем вы можете объявить переменную указателя типа nod*. Вы не можете разыменовать его или объявить переменную типа nod. Для этого компилятору требуется полное объявление класса:

class nod
{
    int someVariable;
    char someOtherVariable;
}

Ещё вопросы

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