#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, хотя вы, вероятно, столкнетесь с той же ошибкой. Когда вы создаете aNode
, вам нужно создать его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
, определив свой собственный конструктор.
Итак, что вы должны делать?
-
Заставьте конструктор узла принимать
Student
(илиconst Studentamp;
и т. Д.). -
Измените последние строки в вашем коде на что-то вроде
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: Задайте другой вопрос, если у вас есть другая проблема.