Как я могу использовать класс прежде, чем определить его?

class Node
{
    string name;
    Node previous;
};

 Error: Node::previous uses "Node" which is being defined.

Как я могу заставить это работать в C++? Это работает в C#.

Править:

Почему Node* previous работы?

7
задан dbr 25 May 2010 в 13:14
поделиться

6 ответов

Использовать указатели. Узел * предыдущий; решит проблему.

Делая это сейчас, вы фактически пытаетесь сделать свой класс бесконечно большим.

10
ответ дан 6 December 2019 в 06:23
поделиться

Используйте указатель или ссылку.

Например:

Node* previous;

Единственное ограничение заключается в том, что класс не может иметь фактическое поле самого себя, скорее всего, по причине конструкции. Подумайте, если каждый Box содержит внутри себя еще один Box, как в итоге вы получите конечное число ящиков?

Если я не ошибаюсь, C# использует ссылки только для типов классов (как и Java), так что вы используете ссылку, просто не видите ее.

8
ответ дан 6 December 2019 в 06:23
поделиться

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

5
ответ дан 6 December 2019 в 06:23
поделиться

В C # объявление previous как это дает вам ссылку. В C ++ объявление previous таким образом дает вам объект, встроенный в каждый объект класса Node .

В объект не может быть рекурсивно встроен объект того же класса . previous.name должен существовать (и иметь выделенную память), как и previous.previous.name , и так далее бесконечно, все в одном выделении памяти. Размер объекта Node должен быть не меньше размера объекта string плюс размер объекта Node (что невозможно поскольку строка больше 0 байт). И другие подобные противоречия.

Как говорят другие, используйте указатель: Узел * предыдущий или ссылку Узел и предыдущий . Или std :: deque ; -)

Возможно, вы захотите узнать, что C ++ отличается от C # другими способами, которые испортят вам день, если вы попытаетесь написать односвязный список путем переноса кода C #. Например, без сборки мусора. Невозможно написать правильный код C ++ без понимания объектной модели C ++.

2
ответ дан 6 December 2019 в 06:23
поделиться

Разве узел не должен быть указателем?

1
ответ дан 6 December 2019 в 06:23
поделиться

Подумайте об объекте 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
};

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

2
ответ дан 6 December 2019 в 06:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: