无法引用默认构造函数
The default constructor cannot be referenced
我正在做一个学校项目,我需要创建一个具有双向列表和结构的图书馆系统。我想实现构造函数以使我的代码更清晰。当我想为双向列表创建结构并使用 new list_of_books
为列表元素保留内存 space 时,问题就出现了。我收到的错误消息是 没有对 Book::Book() 的匹配函数调用和 无法引用“list_of_books” 的默认构造函数 - - 删除函数。这是什么意思,我该如何解决?
struct User {
std::string name;
std::string surname;
User(std::string name, std::string surname)
: name(name), surname(surname) {}
};
struct Date {
int day;
int month;
int year;
Date(int day, int month, int year)
: day(day), month(month), year(year) {}
};
struct Book {
int id;
std::string title;
struct User author;
std::string cathegory;
struct Date hire_date;
struct User reader;
std::string others;
Book(int id, std::string title, std::string nameA, std::string surnameA, std::string cathegory, int day, int month, int year, std::string nameR, std::string surnameR, std::string others)
: id(id), title(title), author(nameA, surnameA), cathegory(cathegory), hire_date(day, month, year), reader(nameR, surnameR), others(others) {}
};
struct list_of_books {
struct Book book;
list_of_books* next;
list_of_books* prev;
};
void push(Book data) {
if (head == NULL) {
list_of_books* element = new list_of_books;
element->book = data;
element->prev = NULL;
element->next = NULL;
head = element;
} else {
list_of_books* curr = head;
while(curr->next != NULL) {
curr = curr->next;
}
list_of_books* element = new list_of_books;
element->book = data;
element->prev = curr;
element->next = NULL;
curr->next = element;
}
}
struct User {
std::string name;
std::string surname;
User(std::string name, std::string surname)
: name(name), surname(surname) {}
};
这个构造函数是有害的。您有一个聚合——一种数据类型——和一个按顺序重复成员的构造函数。
这样做:
struct User {
std::string name;
std::string surname;
};
并重复您编写的所有其他构造函数。
只按顺序重复参数什么都不做的构造函数不是好东西。
如果您删除程序中的所有构造函数,您的程序将会编译。
现在出了什么问题?通过创建构造函数,您删除了默认的无参数构造函数。
然后当您 new list_of_books
时,它会尝试使用不存在的 Book
的构造函数。
请注意,在处理聚合时,如果要就地构造它们,则必须使用 {}
大括号构造列表,例如 Book b = {"The Bookiest Book", "Bob Smith"};
,而不是 ()
作为参数.
我正在做一个学校项目,我需要创建一个具有双向列表和结构的图书馆系统。我想实现构造函数以使我的代码更清晰。当我想为双向列表创建结构并使用 new list_of_books
为列表元素保留内存 space 时,问题就出现了。我收到的错误消息是 没有对 Book::Book() 的匹配函数调用和 无法引用“list_of_books” 的默认构造函数 - - 删除函数。这是什么意思,我该如何解决?
struct User {
std::string name;
std::string surname;
User(std::string name, std::string surname)
: name(name), surname(surname) {}
};
struct Date {
int day;
int month;
int year;
Date(int day, int month, int year)
: day(day), month(month), year(year) {}
};
struct Book {
int id;
std::string title;
struct User author;
std::string cathegory;
struct Date hire_date;
struct User reader;
std::string others;
Book(int id, std::string title, std::string nameA, std::string surnameA, std::string cathegory, int day, int month, int year, std::string nameR, std::string surnameR, std::string others)
: id(id), title(title), author(nameA, surnameA), cathegory(cathegory), hire_date(day, month, year), reader(nameR, surnameR), others(others) {}
};
struct list_of_books {
struct Book book;
list_of_books* next;
list_of_books* prev;
};
void push(Book data) {
if (head == NULL) {
list_of_books* element = new list_of_books;
element->book = data;
element->prev = NULL;
element->next = NULL;
head = element;
} else {
list_of_books* curr = head;
while(curr->next != NULL) {
curr = curr->next;
}
list_of_books* element = new list_of_books;
element->book = data;
element->prev = curr;
element->next = NULL;
curr->next = element;
}
}
struct User {
std::string name;
std::string surname;
User(std::string name, std::string surname)
: name(name), surname(surname) {}
};
这个构造函数是有害的。您有一个聚合——一种数据类型——和一个按顺序重复成员的构造函数。
这样做:
struct User {
std::string name;
std::string surname;
};
并重复您编写的所有其他构造函数。
只按顺序重复参数什么都不做的构造函数不是好东西。
如果您删除程序中的所有构造函数,您的程序将会编译。
现在出了什么问题?通过创建构造函数,您删除了默认的无参数构造函数。
然后当您 new list_of_books
时,它会尝试使用不存在的 Book
的构造函数。
请注意,在处理聚合时,如果要就地构造它们,则必须使用 {}
大括号构造列表,例如 Book b = {"The Bookiest Book", "Bob Smith"};
,而不是 ()
作为参数.