Как использовать связанный список при работе с классом

#c #class #linked-list

#c #класс #связанный список

Вопрос:

Итак, у меня есть класс с именем Student, и я должен составить список учеников, используя связанные списки.

Ниже приведен мой код:

 #include <string>
#include <iostream>
using std::string;
using std::cout;
using std::endl;

class Student
{
private:
    int grade;
    string name;
public:
    Student(int grade, string name)
    {
        this->grade = grade;
        this->name = name;
    }
    void getStudent()
    {
        cout << name << grade << endl;
    }

};

class Node {
public:
    Student student;
    Node* next;
};

void printList(Node* n)
{
    while (n != NULL)
    {
        n->student.getStudent();
        n = n->next;
    }
}

int main()
{
    Node* studentList = NULL;

    studentList = new Node(); // Reported error at this line
    studentList->student = Student(1, "Matei");
    printList(studentList);

}
  

Однако я получаю сообщение об ошибке: невозможно ссылаться на конструктор по умолчанию «Node» — это удаленная функция.

Пожалуйста, помогите мне!

Комментарии:

1. std::list<Student> это связанный список Student s, хотя вы, вероятно, столкнетесь с той же ошибкой. Когда вы создаете a Node , вам нужно создать его Student член. Как вы хотите его создать? (подсказка: вам нужно вызвать один из его конструкторов)

2. Node непосредственно содержит Student , и это Student должно быть создано до ввода тела Node конструктора. Поскольку Student у него нет конструктора по умолчанию, он не может быть создан автоматически, поэтому конструктор по умолчанию Node не может быть использован. Вам нужно будет указать аргументы для Student конструктора в Node списке инициализаторов элементов конструктора.

3. у einpoklum в их ответе есть идея получше, и он нацелен на агрегированную инициализацию

Ответ №1:

Когда мы компилируем ваш код (GodBolt.org ), мы получаем:

 <source>:44:28: error: use of deleted function 'Node::Node()'
   44 |     studentList = new Node(); // Reported error at this line
      |                            ^
<source>:25:7: note: 'Node::Node()' is implicitly deleted because the default definition would be ill-formed:
   25 | class Node {
      |       ^~~~
<source>:25:7: error: no matching function for call to 'Student::Student()'
<source>:13:5: note: candidate: 'Student::Student(int, std::string)'
   13 |     Student(int grade, string name)
  

Позвольте мне интерпретировать это для вас:

Вы пытались создать экземпляр Node с использованием конструктора по умолчанию (без аргументов): Node() . Но — есть ли Node конструктор по умолчанию? Можно подумать, что так и должно быть, потому что вы не удалили его и не определили какой-либо другой конструктор.

… но это было бы ошибкой. Видите ли, одним из полей node является a Student ; и неявный конструктор по умолчанию of Node создает поля Node с использованием их собственных конструкторов по умолчанию. К сожалению, вы неявно удалили конструктор по умолчанию Student , определив свой собственный конструктор.

Итак, что вы должны делать?

  1. Заставьте конструктор узла принимать Student (или const Studentamp; и т. Д.).

  2. Измените последние строки в вашем коде на что-то вроде

     studentList = new Node(Student(1, "Matei"));
    printList(studentList);
      

PS — В примерах здесь, на сайте, пожалуйста, используйте идентификаторы, определяемые пространством имен, такие как std::cout и std::string , и включите их соответствующие заголовки стандартной библиотеки. Не просто пишите cout или string .

Комментарии:

1. Я думаю, вы имеете в виду фигурные скобки, а не обычные скобки. new Node{...} . С таким же успехом можно было бы пройти дистанцию с new Node{{1, "Matei"}, nullptr};

2. Спасибо за ответ, @user4581301 да, это должны быть фигурные скобки.

3. Можете ли вы, ребята, помочь мне с чем-то еще?

4. @MateiAnghel: Задайте другой вопрос, если у вас есть другая проблема.