如何在处理类时使用链表



所以我有一个名为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"的默认构造函数无法引用 - 它是一个已删除的函数

请帮帮我!

当我们编译你的代码(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默认构造函数吗?你会认为它应该,因为你没有删除它,也没有定义任何其他构造函数。

。但这将是一个错误。你看,节点的一个字段是Student;Node的隐式默认构造函数使用自己的默认构造函数构造Node字段。遗憾的是,您通过定义自己的构造函数隐式删除了Student的默认构造函数。

那么,你应该怎么做呢?

  1. 使节点构造函数采用Student(或const Student&等)。

  2. 将代码中的最后几行更改为类似

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

PS - 在站点的示例中,请使用命名空间限定标识符,例如std::coutstd::string,并包含其相关的标准库标头。不要只写coutstring.

相关内容

  • 没有找到相关文章