所以我有一个名为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
的默认构造函数。
那么,你应该怎么做呢?
使节点构造函数采用
Student
(或const Student&
等)。将代码中的最后几行更改为类似
studentList = new Node(Student(1, "Matei")); printList(studentList);
PS - 在站点的示例中,请使用命名空间限定标识符,例如std::cout
和std::string
,并包含其相关的标准库标头。不要只写cout
或string
.