class Node
{
string name;
Node previous;
};
Error: Node::previous uses "Node" which is being defined.
Как я могу заставить это работать в C++? Это работает в C#.
Править:
Почему Node* previous
работы?
Использовать указатели. Узел * предыдущий;
решит проблему.
Делая это сейчас, вы фактически пытаетесь сделать свой класс бесконечно большим.
Используйте указатель или ссылку.
Например:
Node* previous;
Единственное ограничение заключается в том, что класс не может иметь фактическое поле самого себя, скорее всего, по причине конструкции. Подумайте, если каждый Box содержит внутри себя еще один Box, как в итоге вы получите конечное число ящиков?
Если я не ошибаюсь, C# использует ссылки только для типов классов (как и Java), так что вы используете ссылку, просто не видите ее.
Что касается редактирования, подумайте, ваш узел
содержит еще один узел
, который содержит еще один внутри. Итак, у вас есть бесконечная последовательность узлов, содержащихся друг в друге. Вам нужен указатель на место, где хранится следующий узел
. Поэтому вам следует изменить его на Узел *
.
В C # объявление previous
как это дает вам ссылку. В C ++ объявление previous
таким образом дает вам объект, встроенный в каждый объект класса Node
.
В объект не может быть рекурсивно встроен объект того же класса . previous.name
должен существовать (и иметь выделенную память), как и previous.previous.name
, и так далее бесконечно, все в одном выделении памяти. Размер объекта Node
должен быть не меньше размера объекта string
плюс размер объекта Node
(что невозможно поскольку строка
больше 0 байт). И другие подобные противоречия.
Как говорят другие, используйте указатель: Узел * предыдущий
или ссылку Узел и предыдущий
. Или std :: deque
; -)
Возможно, вы захотите узнать, что C ++ отличается от C # другими способами, которые испортят вам день, если вы попытаетесь написать односвязный список путем переноса кода C #. Например, без сборки мусора. Невозможно написать правильный код C ++ без понимания объектной модели C ++.
Подумайте об объекте Car "в реальном мире". Он может содержать ссылку на другой объект Car через VIN-номер. Он может даже содержать ссылку на себя или на значение VIN, равное 0 (NULL, или NO CAR).
Но что, если вам буквально нужен другой ОБЪЕКТ АВТОМОБИЛЯ внутри каждого объекта АВТОМОБИЛЯ? Как бы это работало? Какой объект Car будет содержать содержащий его объект Car?
Java и C# на самом деле помещают не сам объект внутри содержащего класса, а ссылку на него. Такие языки, как C++, позволяют указать, содержится ли в классе ОБЪЕКТ, ССЫЛКА на другой ОБЪЕКТ, содержащийся в классе, или даже ПОИНТЕР на другой ОБЪЕКТ, содержащийся в классе:
class Car
{
Engine engine; // Car CONTAINS an Engine object
};
class Car
{
Engine &engine; // Car contains a REFERENCE to an Engine object
};
class Car
{
Engine *pEngine; // Car contains a POINTER to an Engine object
};
Со временем вы дойдете до того, что будете знать, когда и почему использовать первое, второе или третье, но это уже совсем другой вопрос.