Переопределение типа структуры в C ++? - PullRequest
0 голосов
/ 16 июня 2020

Я запутался в фрагменте кода C ++, когда изучаю C ++. Может ли кто-нибудь помочь мне в этом? Заранее спасибо.

struct LinkNode
{
  int data;
  struct LinkNode* next; // Why there use `struct` type define LinkNode again? 
};

Как мои комментарии, зачем использовать struct type define LinkNode снова? Я думаю, что код struct LinkNode{} уже определил LinkNode. Конечно, если я изменю код, как показано ниже, он также будет работать без ошибок компиляции.

struct LinkNode
{
  int data;
  LinkNode* next; // No any compilation errors either.
};

Ответы [ 2 ]

1 голос
/ 16 июня 2020

В коде

struct LinkNode
{
  int data;
  struct LinkNode* next; // Why there use `struct` type define LinkNode again? 
};

Строка struct LinkNode* next; не определяет новый тип. Он объявляет переменную-член next (уже существующего) типа LinkNode.

То, что вас сбило с толку, вероятно, это ключевое слово struct, которое, как вы уже поняли, является необязательным в этот контекст. Причина, по которой вам разрешено ставить struct здесь в первую очередь, - это наследие от C. C различает имена тегов и имена типов. Объявление формы struct Foo {}; в C вводит только имя тега Foo, но не имя типа. Это означает, что для создания экземпляра объекта Foo в C вам нужно будет написать struct Foo f; с ключевым словом struct, чтобы преобразовать имя тега в соответствующий тип.

Чтобы получить правильное имя типа в C, вам нужно будет использовать typedef: typedef struct Foo FooType;, который затем позволит вам просто написать FooType f;. Поскольку это различие между именами тегов и именами типов оказалось не очень полезным на практике, C ++ просто избавился от этого различия, позволив более простую нотацию объявления, с которой вы знакомы.

1 голос
/ 16 июня 2020

Переопределение типа структуры в C ++?

Это не переопределение типа. Это называется разработанным спецификатором типа. Его можно использовать для устранения неоднозначности имени класса от другого имени, которое его скрывает. В этом случае нет необходимости использовать его. Он также ничего не мешает использовать. В C это необходимо.

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